eventReactive с 2 кнопками действий на 2 вкладках

У меня есть приложение с двумя вкладками, каждая из которых имеет кнопку действия. Я хочу, чтобы тот же процесс запускался при нажатии любой кнопки. Поэтому я написал это следующим образом:

library(shiny)

ui <- fluidPage(
  tabsetPanel(
    tabPanel("tab1",
      actionButton("btn1","Button 1"),
      textOutput("text")
    ),
    tabPanel("tab2",
      actionButton("btn2","Button 2")
    )
  )

)

server <- function(input, output) {
  data=eventReactive(c(input$btn1,input$btn2),{
    print("Button is pressed!")
    print(input$btn1)
    print(input$btn2)
    iris
  })
  output$text=renderText({
    req(data())
    print(head(data()))
    "Really? Button is pressed!"
  })
}

# Run the application 
shinyApp(ui = ui, server = server)

И я не понимаю, почему выражение eventReactive запускается при инициализации приложения до нажатия любой кнопки.

Если я работаю только с 1 кнопкой, то есть input$btn1 вместо c(input$btn1, input$btn2), то я получаю ожидаемое поведение, но не с 2 зависимостями.

Может ли кто-нибудь просветить меня?


person qoheleth    schedule 13.12.2017    source источник


Ответы (2)


eventReactive имеет аргумент ignoreInit, который по умолчанию равен False, см. help(eventReactive).

Ваша проблема решена путем изменения следующей строки:

data=eventReactive(c(input$btn1,input$btn2),{

to

data=eventReactive(c(input$btn1,input$btn2),ignoreInit = T,{

Надеюсь, это поможет!

person Florian    schedule 13.12.2017
comment
ваше решение действительно работает. Но я все еще не понимаю поведения. 1. документ говорит В отличие от того, что происходит для ignoreNULL, только observeEvent принимает аргумент ignoreInit. Что ж, ясно, что eventReactive также принимает этот аргумент. 2. Мне кажется, что это решение подавляет valueExpr, а не триггер (eventExpr). 3. Почему работает одна кнопка? - person qoheleth; 14.12.2017
comment
Я думаю, что это ошибка в документации, поскольку аргумент доступен для обоих. Я создал для этого задачу на Github, посмотрим, правы ли мы;) - person Florian; 14.12.2017
comment
Окончательно закрыты github.com/rstudio/shiny/pull/2036. Спасибо за отчет! - person Bárbara Borges; 24.04.2018

Я предполагаю, что выражение автоматически оценивается как TRUE и, следовательно, выполняется при загрузке. Скорее вы должны использовать {} слушать с двух кнопок.

Модифицированный код:

library(shiny)

ui <- fluidPage(
  tabsetPanel(
    tabPanel("tab1",
             actionButton("btn1","Button 1"),
             textOutput("text")
    ),
    tabPanel("tab2",
             actionButton("btn2","Button 2")
    )
  )

)

server <- function(input, output) {
  data=eventReactive({
    input$btn2
    input$btn1},{
    print("Button is pressed!")
    print(input$btn1)
    print(input$btn2)
    iris
  })
  output$text=renderText({
    req(data())
    print(head(data()))
    "Really? Button is pressed!"
  })
}

# Run the application 
shinyApp(ui = ui, server = server)
person amrrs    schedule 13.12.2017
comment
Я не думаю, что это решение работает. Я делаю триггер условием «И». То есть обе кнопки нужно нажать до того, как что-то произойдет. Я, конечно, тоже не понимаю, почему так. - person qoheleth; 14.12.2017