Я хочу, чтобы два разных события запускали обновление данных, используемых различными графиками / выходами в моем приложении. Один - это нажатая кнопка ( input$spec_button
), а другой - точка на нажатой точке ( mainplot.click$click
).
По сути, я хочу перечислить оба варианта одновременно, но я не уверен, как писать код. Вот что у меня есть сейчас:
в server.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
}
})
Но предложение if-else не работает
Error in mainplot.click$click | input$spec_button :
operations are possible only for numeric, logical or complex types
-> Есть ли какая-то функция объединения действий, которую я могу использовать для этого mainplot.click$click | input$spec_button
предложения?
Ответы:
Я знаю, что это старый, но у меня был тот же вопрос. Я наконец-то понял. Вы включаете выражение в фигурные скобки и просто перечисляете события / реактивные объекты. Мое (необоснованное) предположение состоит в том, что shiny просто выполняет тот же анализ реактивного указателя на этот блок выражения, что и на стандартный
reactive
блок.observeEvent({ input$spec_button mainplot.click$click 1 }, { ... } )
РЕДАКТИРОВАТЬ
Обновлено для обработки случая, когда последняя строка в выражении возвращает NULL. Просто верните постоянное значение.
источник
observeEvent
используетсяignoreNULL = TRUE
по умолчанию, что означает, что еслиmainplot.click$click
(возвращаемое значение) равноNULL
, обработчик никогда не будет вызван, даже если он будетinput$spec_button
изменен. Я бы порекомендовал что-то вроде ответа @ JustAnother, чтобы не попасть в эту ловушку.{}
) ТРЕБУЕТ, чтобы каждое событие располагалось на отдельной строке новой строки, в противном случае он выдает ошибку «Ошибка при синтаксическом анализе ...», как только синтаксический анализатор обнаруживает второе событие. например, все в одной строке:observeEvent({input$spec_button mainplot.click$click}, {...})
не удается. Ответ @ JustAnother с использованием синтаксиса комбинирования S3 Generic (c()
) работает независимо от новых строк.Также:
observeEvent(c( input$spec_button, mainplot.click$click ), { ... } )
источник
{
версия - нет. Я не могу объяснить, почему это так.input$button1
и ониinput$button2
делают очень похожие вещи, только с другим индексом. Я бы не хотел копировать код несколько раз только потому, что не знаю индекса. Благодаря!Я решил эту проблему с помощью создания реактивного объекта и использования его в выражении изменения события. Как показано ниже:
источник
Вот решение, которое я придумал: в основном, создать пустой
reactiveValues
держатель данных, а затем изменить его значения на основе двух отдельныхobserveEvent
экземпляров.источник
list(mainplot.click$click, input$spec_button)
также будет работать для OP.Это все еще можно сделать с помощью eventReactive, просто поместив свои действия в вектор.
eventReactive( c(input$spec_button, mainplot.click$click), { ... } )
источник
Идея здесь состоит в том, чтобы создать реактивную функцию, которая будет выполнять условие, которое вы хотите передать в ObservationEvent, а затем вы можете передать эту реактивную функцию, чтобы проверить действительность оператора. Например:
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(), { ... } )
Продолжайте кодировать!
источник