【问题标题】:Multiple reactiveValues In a Shiny App闪亮应用程序中的多个反应值
【发布时间】:2017-03-10 01:59:46
【问题描述】:

我在 Shiny 中经常使用 reactiveValues,因为它们比 inputoutput 对象更灵活。嵌套的 reactiveValues 很棘手,因为任何孩子的任何变化也会触发与父母相关的反应。为了解决这个问题,我尝试制作两个不同的 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)

【问题讨论】:

  • 我同意,我发现在许多情况下,reactiveValues 比其他闪亮的表达式更方便,尽管它们在闪亮的文档和示例中没有很好的记录。看看这个问题stackoverflow.com/questions/39436713。在您的特定示例中,它确实适用于单个反应值。您能否展示您所指问题的代码示例?
  • 为了保持我的变量井井有条,我希望有一个列表作为 reactiveValue 的元素之一(类似于reactveValues(somelist = list(a = 1, b = 1, c = 1)))。该列表将包含多个元素,这些元素将在各个地方使用。现在,如果我更新这个列表中的一个元素,比如a,那么反应似乎会传递给somelist。因此,即使 b 没有改变,任何其他调用 somelist$b 的块也会被触发。
  • @TheComeOnMan 你有没有找到解决多个反应值的方法?我有同样的问题 - 嵌套列表不起作用(正如你所指出的)

标签: r shiny


【解决方案1】:

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)

【讨论】:

  • 就像我在评论中提到的那样,出于逻辑考虑,我想将其中的一些价值观结合起来。在我的问题中,reac1 和 reac2 是反应值的两个逻辑组。将他们加入俱乐部的另一种方法是列出一个列表,reactveValues(somelist = list(a = 1, b = 1, c = 1))),但这带来了我在评论中也提到的问题。我会尝试为此添加代码。
猜你喜欢
  • 2017-07-27
  • 2018-07-09
  • 2018-12-29
  • 2019-01-10
  • 2014-10-04
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
  • 2013-07-08
相关资源
最近更新 更多