我在 Shiny 应用程序中创建一系列事件时遇到问题。我知道还有其他方法可以处理这个问题的某些部分(使用 JS),以及我可以使用不同的 Shiny 函数来实现类似的目的(例如withProgress
),但我想了解如何使这个工作具有反应性。
我希望实现的流程如下:1)用户单击操作按钮,这导致 A)开始耗时的计算 B)打印到 UI 的简单语句让用户知道计算已经开始 2)一次计算返回一个值,触发对先前文本输出的另一个更新,提醒用户计算完成
我已经尝试使用操作按钮来更新文本值,并在该值上设置观察者以开始计算(以便 1B 在 1A 之前运行),以确保消息不仅在 UI 中显示一次计算完成,但还没有得到任何工作。这是我最近的尝试:
ui <- fluidPage(
sidebarLayout(
sidebarPanel(
actionButton("run", "Pull Data")
mainPanel(
textOutput("status")
)
)
)
server <- function(input, output, session) {
# slow function for demonstration purposes...
test.function <- function() {
for(i in seq(5)) {
print(i)
Sys.sleep(i)
}
data.frame(a=c(1,2,3))
}
report <- reactiveValues(
status = NULL,
data = NULL
)
observeEvent(input$run, {
report$status <- "Pulling data..."
})
observeEvent(report$status == "Pulling data...", {
report$data <- test.function()
})
observeEvent(is.data.frame(report$data), {
report$status <- "Data pull complete"
}
)
observe({
output$status <- renderText({report$status})
})
}
最终,我希望将其构建为更长的计算+用户输入周期,因此我希望找到一种观察者+反应元素的良好模式来处理这种持续的交互。任何帮助表示赞赏!