在一个闪亮的应用程序中的多个reactiveValues

时间:2016-10-27 11:38:42

标签: r shiny

我在Shiny中使用reactiveValues因为它们比inputoutput对象更灵活。嵌套的反应值很棘手,因为任何一个孩子的任何变化也会触发与父母相关的反应。为了解决这个问题,我尝试制作两个不同的reactiveValues个对象(不是同一个列表中的两个对象,而是两个不同的列表),它似乎正在工作。我无法找到任何这方面的例子,并想知道它是否以这种方式工作。由于这个原因,是否会出现任何问题?

在此应用中,有两个被动值对象 - reac1reac2。它们中的每一个都分别与下拉列表column1column2相关联。更改column1column2会使用最新时间更新被动值,更新图表,并在reac1reac2中打印最新值。

ui = fluidPage(
  titlePanel("Multiple reactive values"),
  sidebarLayout(
    sidebarPanel(
      selectInput(inputId = "column1", "Reac1", letters, selected = "a"),
      selectInput(inputId = "column2", "Reac2", letters, selected = "a")
    ),
    mainPanel(
      plotOutput("plot1")
    )
  )
)

server = function(input, output, session) {
  reac1 <- reactiveValues(asdasd = 0)
  reac2 <- reactiveValues(qweqwe = 0)

  # If any inputs are changed, set the redraw parameter to FALSE
  observe({
    input$column2
    reac2$qweqwe = Sys.time()
  })

observe({
    input$column1
    reac1$asdasd = Sys.time()
  })


  # Only triggered when the copies of the inputs in reac are updated
  # by the code above
  output$plot1 <- renderPlot({
      print(paste(reac1$asdasd, 'reac1'))
      print(paste(reac2$qweqwe, 'reac2'))
      hist(runif(1000))
  })
}
shinyApp(ui, server)

1 个答案:

答案 0 :(得分:0)

ReactiveValues类似于input $的读/写版本,您可以在一个reactiveValue列表中包含多个“独立”变量。因此,您的示例中不需要两个无效值。请参阅下面的代码。

ui = fluidPage(
  titlePanel("Multiple reactive values"),
  sidebarLayout(
    sidebarPanel(
      selectInput(inputId = "column1", "Reac1", letters, selected = "a"),
      selectInput(inputId = "column2", "Reac2", letters, selected = "a")
    ),
    mainPanel(
      verbatimTextOutput("txt1"),
      verbatimTextOutput("txt2")
    )
  )
)

server = function(input, output, session) {
  reac <- reactiveValues()
  #reac2 <- reactiveValues(qweqwe = 0)

  # If any inputs are changed, set the redraw parameter to FALSE

  observe({ 
    reac$asdasd =  input$column1
  })  
  observe({ 
    reac$qweqwe = input$column2
  }) 

  # Only triggered when the copies of the inputs in reac are updated
  # by the code above
  output$txt1 <- renderPrint({
    print('output 1')
    print(paste(reac$asdasd, 'reac1'))  
  })

  output$txt2 <- renderPrint({ 
    print('output2') 
    print(paste(reac$qweqwe, 'reac2')) 
  }) 

}
shinyApp(ui, server)