Quero dois eventos diferentes para acionar uma atualização dos dados que estão sendo usados por vários gráficos / saídas em meu aplicativo. Um é um botão sendo clicado ( input$spec_button
) e o outro é um ponto em um ponto sendo clicado ( mainplot.click$click
).
Basicamente, quero listar os dois ao mesmo tempo, mas não tenho certeza de como escrever o código. Aqui está o que tenho agora:
no 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
}
})
Mas a cláusula if-else não funciona
Error in mainplot.click$click | input$spec_button :
operations are possible only for numeric, logical or complex types
-> Existe algum tipo de função combinadora de ação que eu possa usar para a mainplot.click$click | input$spec_button
cláusula?
Respostas:
Eu sei que isso é antigo, mas eu tinha a mesma pergunta. Eu finalmente descobri. Você inclui uma expressão entre colchetes e simplesmente lista os eventos / objetos reativos. Minha suposição (não comprovada) é que brilhante simplesmente executa a mesma análise de ponteiro reativo para este bloco de expressão como para um
reactive
bloco padrão .observeEvent({ input$spec_button mainplot.click$click 1 }, { ... } )
EDITAR
Atualizado para lidar com o caso em que a última linha da expressão retorna NULL. Simplesmente retorne um valor constante.
fonte
observeEvent
usaignoreNULL = TRUE
por padrão, o que significa que semainplot.click$click
(o valor de retorno) forNULL
, o manipulador nunca será chamado, mesmo seinput$spec_button
alterado. Eu recomendaria algo como a resposta de @JustAnother para evitar cair nessa armadilha.{}
) REQUER que cada evento esteja em sua própria nova linha, caso contrário, ele falha com "Erro na análise ..." assim que o analisador encontra o segundo evento. por exemplo, tudo em uma linha:observeEvent({input$spec_button mainplot.click$click}, {...})
falha. A resposta de @JustAnother usando a sintaxe de combinação S3 Generic (c()
) funciona independentemente das novas linhas.Além disso:
observeEvent(c( input$spec_button, mainplot.click$click ), { ... } )
fonte
{
versão não. Não consigo explicar por que isso acontece.input$button1
einput$button2
que façam coisas muito semelhantes, apenas com um índice diferente. Gostaria de evitar copiar o código várias vezes só porque não conheço o índice. Obrigado!Resolvi esse problema com a criação de um objeto reativo e uso-o na expressão de mudança de evento. Como abaixo:
fonte
Aqui está a solução que encontrei: basicamente, crie um
reactiveValues
suporte de dados vazio e, em seguida, modifique seus valores com base em duasobserveEvent
instâncias separadas .fonte
list(mainplot.click$click, input$spec_button)
também trabalhar para o caminho de OP.Isso ainda pode ser feito com eventReactive simplesmente colocando suas ações em um vetor.
eventReactive( c(input$spec_button, mainplot.click$click), { ... } )
fonte
A ideia aqui é criar uma função reativa que irá executar a condição que você deseja passar em observeEvent e então você pode passar essa função reativa para verificar a validade da instrução. Por exemplo:
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(), { ... } )
Continue codificando!
fonte