首页 > 解决方案 > 收听列表​​中的响应式

问题描述

我正在尝试添加reactives到列表中并听取他们的意见。我不明白为什么在下面的代码中我没有看到任何输出,dbg1而它在dgb2.

唯一的区别是,l2将包含一个reactiveon startup,而l1仅在第一次按下按钮之后,其他方面都相同。

对此有何解释?

library(shiny)
library(purrr)

ui <- fluidPage(
   actionButton("add1", "Add to List 1"), 
   actionButton("add2", "Add to List 2"), 
   actionButton("rnd", "Generate Random"),
   verbatimTextOutput("dbg1"),
   verbatimTextOutput("dbg2"))

server <- function(input, output, session) {
   l1 <- l2 <- list()
   
   observeEvent(input$add1, {
      l1 <<- c(l1, reactive({
         input$rnd
         sample(100, 1)
      }))
   })
   
   observeEvent(input$add2, {
      l2 <<- c(l2, reactive({
         input$rnd
         sample(100, 1)
      }))
   }, ignoreNULL = FALSE)
   
   output$dbg1 <- renderPrint(map(l1, ~ .x()))
   output$dbg2 <- renderPrint(map(l2, ~ .x())) 
}

shinyApp(ui, server)

阅读@stefan 的答案和@starja 的评论后,我想更准确地呈现这个问题。

目标

我想要一个动态容器reactives。也就是说,一个动态创建的数量reactives,它根据一些输入来做他们的事情。

问题

我认为在我的代码中renderPrintfordbg1仅在启动时调用。它意识到没有reactive上下文(确实是后来才添加的),因此永远不会回忆它。在这种情况下,dbg1它至少看到一个反应,因此回来了。所以我想我必须自己做出l1反应(正如@stefan所指出的)

标签: rshinyshiny-reactivity

解决方案


不确定您最终要达到的目标。但是在这篇文章之后,您可以更新您的列表并通过以下方式打印它们reactiveVal

library(shiny)
library(purrr)

ui <- fluidPage(
  actionButton("add1", "Add to List 1"), 
  actionButton("add2", "Add to List 2"), 
  actionButton("rnd", "Generate Random"),
  verbatimTextOutput("dbg1"),
  verbatimTextOutput("dbg2"))

server <- function(input, output, session) {
  l1 <- reactiveVal(value = list())
  l2 <- reactiveVal(value = list())
  
  rnd <- eventReactive(input$rnd, {
    sample(100, 1)
  })
  
  observeEvent(input$add1, {
    old_value <- l1()
    l1(c(old_value, rnd()))
  })
  observeEvent(input$add2, {
    old_value <- l2()
    l2(c(old_value, rnd()))
  })
  
  output$dbg1 <- renderPrint(l1())
  output$dbg2 <- renderPrint(l2()) 
}

shinyApp(ui, server)

在此处输入图像描述


推荐阅读