如何隔离闪亮的反应式列表的元素?

时间:2019-11-08 22:46:41

标签: r shiny reactive

假设我下面有以下测试应用。我正在寻找的是如何复制reactiveValues解决方案的功能。如果您使用该应用程序,则会发现isolate影响功能的方式存在一种差异。使用反应性值,我可以在反应性列表中选择要隔离的元素。

因此,如果用户单击按钮1,则时间将始终更改。因此,时间将始终显示在观察中。如果用户单击同一按钮,则由于data不变,因此仅显示时间。如果在按钮之间切换单击,则将同时显示按钮的名称和时间。

您似乎无法使用reactive复制此功能。我的问题是我正在使用reactivePoll的实际情况。我的reactPoll返回一个列表myData。我想做的是仅在isolate更改时才能myData$firstel。但是似乎从myData更新的任何反应式都将更新myData$firstelmyData$secondel的变化。有办法解决吗?我尝试将我的reactPoll转换为reactValues,但似乎不起作用

library(shiny)

ui <- fluidPage(
  actionButton("button1","Button 1"),
  actionButton("button2","Button 2"),
  textOutput("output1"),
  textOutput("output2")
)

server <- function(input,output,session){

  myreactval <- reactiveValues(data = NULL, selection = NULL)

  observeEvent(input$button1,{
    myreactval$data <- Sys.time()
    myreactval$selection <- "button1"
  })
  observeEvent(input$button2,{
    myreactval$data <- Sys.time()
    myreactval$selection <- "button2"
  })


  myreact <- eventReactive(input$button1,{
    res <- list()
    res$data <- Sys.time()
    res$selection <- "button1"
    return(res)
  })


  output$output1 <- renderText({ myreact()$data })
  output$output2 <- renderText({ myreact()$selection })

  # REACTIVE SOLUTION
  # observe({
  #   print(myreact()$selection)
  # })
  # observe({
  #   print(isolate(myreact())$data)
  # })

  # REACTIVE VALUES SOLUTION
  observe({
    print(myreactval$selection)
  })
  observe({
    print(isolate(myreactval)$data)
  })
}

shinyApp(ui,server)

1 个答案:

答案 0 :(得分:0)

您可以使用以下代码段将反应式列表reacList转换为reactValues对象reacVals

  reacVals <- reactiveValues()
  observe(
      purrr::imap(reacList(), function(val, name) {
        reacVals[[name]] <- val
      })
    )

reacList中的任何元素更改时,reactiveValues中的所有元素都会更新。但是,这些更新仅在元素值实际更改时才使其他依赖项无效。这意味着您可以使用reacVals创建特定于元素的依赖关系,这是您想要实现的。

我知道您已经尝试将reactivePoll对象转换为reactiveValues对象,但这可能与您的方法不同。