【问题标题】:Modifying a reactive value should trigger an observe chunk修改一个反应值应该触发一个观察块
【发布时间】:2015-09-11 08:53:36
【问题描述】:

我正在修改 observeEvent 中的反应值。我有另一个 observe 块,它调用这个反应值。鉴于这种反应值依赖性,我希望observe 块在observeEvent 块的末尾被触发,但这似乎没有发生。这是预期的行为吗?

http://shiny.rstudio.com/reference/shiny/latest/reactiveValues.html 说 - “当您从中读取一个值时,调用响应式表达式会对该值进行响应式依赖,并且当您写入它时,它会通知任何依赖于该值的响应式函数。”

在下面的示例中,每次单击按钮时,我都希望输出带有 2 的 cat,并且根据 counter 的值,也会输出带有 3 的 cat。情况并非如此,输出通常会打印带有 1 的 cat,而不是带有 2 和 3 的 cats。

server.r

shinyServer ( 

   function(input, output, session) {

      lReactiveValues = reactiveValues(a = 1.1)

      voidaA = observeEvent(
         input$buttonCommit,
         {
            a = runif(1)
            cat(a,' 1\t')
            lReactiveValues$a = a
         }
      )

      voidB = observe({
         counter = runif(1)
         cat(counter,' 2\t'); 

         if (counter > 0.5) {

            cat('\n')

            cat(lReactiveValues$a,' 3\n')

         }
      }
      )

   }
)

ui.r

dashboardPage(

   dashboardHeader(

      title = "Analytics"

   ),

   ## Sidebar content
   dashboardSidebar(
   menuItem("Analysis", tabName = "tabAnalysis", icon = icon("calculator"))
   ),

   ## Body content
   dashboardBody(
      tabItems(
         tabItem(
            tabName = "tabAnalysis",
            actionButton("buttonCommit", "Commit!")
         )
      )
      #, style='width: 100%; height: 100%;'

   )
)

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    我不是 100% 确定我完全理解你想要什么,但也许你想要的只是添加 lReactiveValues$a 作为 voidB 观察者内的第一行。看看它是否像你期望的那样工作。

    如果这是您的问题,我想我了解问题的根源。观察者的工作方式是它们首先运行并记录他们可以找到的所有反应性依赖关系,然后每当这些依赖关系中的一个发生变化时,观察者就会再次运行。由于您在那里有一个随机器,这意味着应用程序运行的一半时间,使用lReactiveValues$a 的代码行永远不会运行,因此观察者不知道lReactiveValues$a 是一个依赖项。这就是为什么您会注意到不一致的行为 - 有时 voidB 会运行几次,但最终会在随机数

    【讨论】:

    • 另外,通常不需要将observe或observeEvent的输出赋值给变量
    • 谢谢,好像是这样。我觉得这不是observe 的正确行为方式,我很想提交错误请求。在我的实际应用程序中,lReactiveValues$a 对象实际上是我正在修改的一个非常大的数据框。你知道如果我只是在函数的开头调用它,然后对实际逻辑执行类似a = isolate(lReactiveValues$a)` 之类的操作,是否会对性能产生影响?
    • 这绝对不是错误,但确实是一个不幸的问题。只有知道反应性是如何工作的,这才有意义。我相信this article 解释了这些概念。实际上,我确实向 Joe(闪亮的创建者)询问了这个问题,他同意这是一个限制,但不是真正的“错误”。 groups.google.com/forum/#!topic/shiny-discuss/dSZVgU960wU 另外,另一种解决方法是使用 observeEvent(lReactiveValues$a, ...)
    • 至于你的问题,只要你不打印或修改它,我认为调用变量不会对性能造成任何影响。您可以使用microbenchmark 自己测试它,或者提出一个单独的 SO 问题,但我很确定它不会导致任何缓慢
    猜你喜欢
    • 2020-07-27
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 2012-09-08
    • 2013-09-04
    • 2023-04-08
    • 1970-01-01
    • 2020-01-17
    相关资源
    最近更新 更多