【发布时间】:2021-10-26 23:32:02
【问题描述】:
一旦用户选择了输入参数,我就会在 Shiny 应用程序中运行相当耗时的计算。为了确保计算不会运行不必要的时间,我制作了以下操作按钮:
actionButton('seeData','see Data' )
然后我尝试使用以下代码在每次按钮单击时只运行一次耗时的计算(并且在没有按钮单击时从不运行):
observeEvent( input$seeData, {
...long, includes several function calls...
})
在observeEvent 内,我确实引用了其他输入参数。
我发现无论我调整输入参数多少次,计算都不会在我按下按钮后第一次运行。 但是,一旦我按下按钮一次,只要更改任何输入参数,计算就会运行。 为什么我只按下按钮一次,代码会运行第二次、第三次、第四次(等等)?
我的目标似乎只是typical use case,但我想observeEvent 的observe 或isolate 方面有些棘手,我不明白。我做错了什么,如何实现一键式计算功能?
【问题讨论】:
-
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()