【问题标题】:ShinyR: run code only once after button clickedShiny:单击按钮后仅运行一次代码
【发布时间】:2021-10-26 23:32:02
【问题描述】:

一旦用户选择了输入参数,我就会在 Shiny 应用程序中运行相当耗时的计算。为了确保计算不会运行不必要的时间,我制作了以下操作按钮:

 actionButton('seeData','see Data' )

然后我尝试使用以下代码在每次按钮单击时只运行一次耗时的计算(并且在没有按钮单击时从不运行):

 observeEvent( input$seeData, {

   ...long, includes several function calls...  

})

observeEvent 内,我确实引用了其他输入参数。

我发现无论我调整输入参数多少次,计算都不会在我按下按钮后第一次运行。 但是,一旦我按下按钮一次,只要更改任何输入参数,计算就会运行。 为什么我只按下按钮一次,代码会运行第二次、第三次、第四次(等等)?

我的目标似乎只是typical use case,但我想observeEventobserveisolate 方面有些棘手,我不明白。我做错了什么,如何实现一键式计算功能?

【问题讨论】:

  • observeEvent 仅在一个事件上触发,而不是在其中包含的其他可能反应的变量上触发。如果您需要,请尝试使用observe。其次,您需要在 somewhere 中存储一个变量,该变量默认(例如)为FALSE,并且此observe* 块的第一行是if (! alreadyDone) { alreadyDone <- TRUE; ... }
  • @r2evans 但我的意思是它不仅仅在按钮点击时触发。应用程序中没有其他功能。无论按钮点击如何,都会在调整参数时触发。
  • 哦,呵呵......我已经尝试过,但从来没有能够获得observeEvent 来触发除主要参数之外的任何东西。虽然我认为我不能提供更多,但当我遇到令人困惑的反应时,我会用message 调用其他块来查看事件链。反应性可能难以控制好/有效。抱歉,我想我出局了。
  • 您是否尝试过将长函数封装在isolate({}) 中?我能够通过运行这样的东西来实现这一点:output$myOutput <- myFunction({ input$actionButton isolate({ long running function }) })
  • 不要在observeEvent()之前使用observer()reactive()

标签: r shiny


【解决方案1】:

在操作按钮上使用 enable() 和 disable()。

所以当点击按钮时(在长时间计算之前)禁用按钮,直到计算完成......

然后在最后再次重新启用按钮...

【讨论】:

  • 清洁解决方案!需要 library(shinyjs) 和 ui.R 中的 useShinyjs() 调用
【解决方案2】:

Here我们可以看到observeEventeventReactive的使用说明。有趣的是在示例中,您可以在其中看到函数的反应性如何仅在单击按钮的那一刻执行。

方法是定义一个包含要显示的数据的EventReactive 变量。即使输入发生变化,这将使函数保持其值。只有按下按钮才会改变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    相关资源
    最近更新 更多