Quiero que dos eventos diferentes activen una actualización de los datos que utilizan varios gráficos / salidas en mi aplicación. Uno es un botón en el que se hace clic ( input$spec_button
) y el otro es un punto en un punto en el que se hace clic ( mainplot.click$click
).
Básicamente, quiero enumerar ambos al mismo tiempo, pero no estoy seguro de cómo escribir el código. Esto es lo que tengo ahora:
en servidor.R:
data <- eventReactive({mainplot.click$click | input$spec_button}, {
if(input$spec_button){
# get data relevant to the button
} else {
# get data relevant to the point clicked
}
})
Pero la cláusula if-else no funciona
Error in mainplot.click$click | input$spec_button :
operations are possible only for numeric, logical or complex types
-> ¿Hay algún tipo de función de combinación de acciones que pueda usar para la mainplot.click$click | input$spec_button
cláusula?
Respuestas:
Sé que esto es antiguo, pero tenía la misma pregunta. Finalmente lo resolví. Incluye una expresión entre llaves y simplemente enumera los eventos / objetos reactivos. Mi suposición (sin fundamento) es que shiny simplemente realiza el mismo análisis de puntero reactivo para este bloque de expresión que para un
reactive
bloque estándar .observeEvent({ input$spec_button mainplot.click$click 1 }, { ... } )
EDITAR
Actualizado para manejar el caso donde la última línea de la expresión devuelve NULL. Simplemente devuelva un valor constante.
fuente
observeEvent
usaignoreNULL = TRUE
de forma predeterminada, lo que significa que simainplot.click$click
(el valor de retorno) esNULL
, nunca se llamará al controlador, incluso si seinput$spec_button
cambia. Recomendaría algo como la respuesta de @ JustAnother para evitar caer en esta trampa.{}
) REQUIERE que cada evento esté en su propia línea nueva, de lo contrario, falla con "Error en el análisis ..." tan pronto como el analizador encuentra el segundo evento. por ejemplo, todo en una línea:observeEvent({input$spec_button mainplot.click$click}, {...})
falla. La respuesta de @ JustAnother usando S3 Generic combine syntax (c()
) funciona independientemente de las nuevas líneas.También:
observeEvent(c( input$spec_button, mainplot.click$click ), { ... } )
fuente
{
versión no. No puedo explicar por qué es así.input$button1
yinput$button2
que hacen cosas muy similares, solo que con un índice diferente. Me gustaría evitar copiar el código varias veces solo porque no conozco el índice. ¡Gracias!Resolví este problema al crear un objeto reactivo y usarlo en la expresión de cambio de evento. Como a continuación:
xxchange <- reactive({ paste(input$filter , input$term) }) output$mypotput <- eventReactive( xxchange(), { ... ... ... } )
fuente
Esta es la solución que se me ocurrió: básicamente, cree un contenedor de
reactiveValues
datos vacío y luego modifique sus valores en función de dosobserveEvent
instancias separadas .fuente
list(mainplot.click$click, input$spec_button)
también trabajar por el camino de la OP.Esto todavía se puede hacer con eventReactive simplemente poniendo sus acciones en un vector.
eventReactive( c(input$spec_button, mainplot.click$click), { ... } )
fuente
La idea aquí es crear una función reactiva que ejecutará la condición que desea pasar en observeEvent y luego puede pasar esta función reactiva para verificar la validez de la declaración. Por ejemplo:
validate_event <- reactive({ # I have used OR condition here, you can use AND also req(input$spec_button) || req(mainplot.click$click) }) observeEvent(validate_event(), { ... } )
¡Sigue codificando!
fuente