Назначение реактивного выражения дважды игнорирует первое - PullRequest
0 голосов
/ 06 августа 2020

Блестящий новичок: я хочу загрузить другой набор данных в зависимости от того, на какую кнопку действия нажимают. Поскольку обработка оттуда будет одинаковой для любого набора данных, я хочу сохранить их в одном и том же реактивном выражении, здесь dataset().

См. Мой код:

library(shiny)

ui <- shinyUI(fluidPage(
    sidebarLayout(
        sidebarPanel(
            
            actionButton("gohere", "dataset1"),
            actionButton("gothere", "dataset2")
            
        ),
        
        mainPanel(
            
            tableOutput("dataset")
            
        ),        
 
        )
    )
)



server <- function(input, output) { 
    
    
dataset <- eventReactive(input$gohere, {
    
            mtcars
        })

dataset <- eventReactive(input$gothere, {
    
            cars
    
        })
    
    
output$dataset <- renderTable({
    
    dataset()
    
        })

}

shinyApp(ui = ui, server = server)

I ожидайте, что этот код загрузит mtcars в dataset, когда нажата кнопка actionButton «gohere», и продолжите с renderTable и загрузите cars в набор данных, когда нажата кнопка actionButton «gothere», и продолжайте аналогично.

Однако: если я нажимаю кнопку actionButton "gothere", все работает должным образом, если я нажимаю "gohere", ничего не происходит. Если я изменю порядок «gohere» и «gothere» внутри функции server, все будет наоборот.

Что делает второй eventReactive() с dataset, что полностью аннулирует первое eventReactive()?

РЕДАКТИРОВАТЬ: И если он перезаписывает его, что он перезаписывает?

1 Ответ

2 голосов
/ 06 августа 2020

Это работает как обычное программирование на R: ваши два реактивных проводника являются объектами R с тем же именем, поэтому второй перезаписывает первый.

Вы можете использовать реактивное значение и некоторых наблюдателей:

library(shiny)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      actionButton("gohere", "dataset1"),
      actionButton("gothere", "dataset2")
    ),
    mainPanel(
      tableOutput("dataset")
    ),        
  )
)

server <- function(input, output) { 
  
  dataset <- reactiveVal(mtcars)
  
  observeEvent(input$gohere, {
    dataset(mtcars)
  })
  
  observeEvent(input$gothere, {
    dataset(cars)
  })
  
  output$dataset <- renderTable({
    dataset()
  })
  
}

shinyApp(ui = ui, server = server)
...