r - 您如何检查 R Shiny 中的所有后代是否都是干净的(未失效)?
问题描述
假设我在 Shiny 中有一个观察者,如下所示:
observe({
input$obs_1
input$obs_2
input$obs_3
# do "something"
# ...
# ...
# If the code above finished doing "something," set a reactive value
rv$something_is_done <- FALSE
rv$something_is_done <- TRUE
})
上面的观察者每次obs_1
, obs_2
, 或obs_3
改变都会做“某事”。
如何检查所有输入是否已完成更改,以及do something
代码块是否已最后一次运行?
一旦上面的观察者返回“空闲”(回到监听三个输入),我希望最后的反应值,rv$something_is_done
触发“另一件事”发生,可能类似于下面的内容:
observe({
rv$something_is_done
if(rv$something_is_done) {
# do "another thing"
# ...
# ...
}
})
解决方案
观察者一直在倾听变化。鉴于您在其中有预设值,obs_1, obs_2,...
它只关注那些。因此,它不知道或不关心您是否考虑其他 2 个输入来等待更改。debounce
如果您愿意,您可以做的是延迟这种反应。请注意,在设置所有参数后,它设置为等待 3 秒。我已将 3 个变量添加到列表中,以便您以后可以将其用作mystuff_d()
library(shiny)
library(magrittr)
ui <- fluidPage(
sliderInput("obs_1", "obs_1", min = 0, max = 1000, value = 500),
sliderInput("obs_2", "obs_2", min = 0, max = 1000, value = 500),
sliderInput("obs_3", "obs_3", min = 0, max = 1000, value = 500)
)
rv <- reactiveValues(something_is_done <- FALSE)
server <- function(input,output,session){
mystuff <- eventReactive(c(input$obs_1,input$obs_2,input$obs_3),{
rv$something_is_done <- FALSE
c(input$obs_1,input$obs_2,input$obs_3)
},ignoreInit = TRUE)
mystuff_d <- mystuff %>% debounce(3000)
observeEvent(mystuff_d(),{
print(mystuff_d())
# do "something"
# ...
# ...
rv$something_is_done <- TRUE
})
observeEvent(rv$something_is_done,{
if(rv$something_is_done){
# do "another thing"
# ...
# ...
print("another thing")
}
},ignoreInit = TRUE)
}
shinyApp(ui=ui,server = server)
推荐阅读
- html - 内部 div
- 工作正常,但
- 不管用。如何解决这个问题?
- ios - 如何更改在 SwiftUI 中的 forEach 内动态创建的按钮的颜色
- list - 需要将 scala 中的两个列表与一些替换条件结合起来
- networking - 如何从 igraph 对象中提取节点 ID 到 R 中的 data.frame 对象中?
- c# - SSL 证书错误:ssl.ca.location 失败
- magento - Magento 2 (v2.3) - 购物车页面 - 是否可以在自定义模块插件中获取 mage-cache-storage 存储的运费?
- windows - databricks-connect 在 Windows 上不起作用
- python - 根据来自多个其他表的数据动态生成 SQL Insert Rows 数据
- python - 如何使用 Python 在 Keras 中为 ANN 绘制 10 倍交叉验证的 ROC 曲线?
- python-3.x - 基于数据框的另一列修改列的优化方法