gpt4 book ai didi

r - Shiny 的 promise future 不适用于 eventReactive

转载 作者:行者123 更新时间:2023-12-03 22:12:30 25 4
gpt4 key购买 nike

我有一个 inputButton,当您单击它时,完成了对 mysql 数据库的 2 次查询。一个是重的(超过 10 秒),另一个是轻的(小于 0.01 秒获取数据)。

由于我想在 Shiny 的应用程序上显示此查询的结果,因此我打算使用 Promises 和 Future 包进行异步加载。

在我向您展示我的代码的示例中,我使用函数heavyFunction 模拟了 SQL 查询,该函数旨在模拟繁重的查询和一次加载的 ligth。

问题是这段代码对我不起作用,因为在完成重查询之前不会显示轻查询的结果。

注意:在 Rstudio 控制台中,此代码完美运行...

library(future)
library(promises)
plan(multiprocess)

heavyFunction <- function(n){
Sys.sleep(n)
print(n)
}


ui <- fluidPage(
actionButton("go","Show the data"),
textOutput("result0sec"),
textOutput("result10sec")

)

server <- function(input,output,session){


data0 <- eventReactive(input$go,{
heavyFunction(0)


})

data10 <- eventReactive(input$go,{
heavyFunction(10)


})
output$result0sec <- renderText({
data <- data0()
future(data)%...>%print()
})


output$result10sec <- renderText({
data <- data10()
print(data)
})




}
shinyApp(ui,server)

我做错了什么?

最佳答案

欢迎来到 SO!

This线程讨论了同样的问题。

详情请见answer来自 GitHub 上的 Joe Cheng。

您遇到的主要问题反射(reflect)在他的以下声明中:

The goal, at least for this release of Shiny, is not to allow this kind of intra-session responsiveness, but rather, inter-session; i.e., running an async operation won't make its owning session more responsive, but rather will allow other sessions to be more responsive.



但是,有一些方法可以通过在后台 R 进程中运行 future 来解决此行为,例如 library(callr)或者更方便 library(future.callr)它是 plan(callr) .

这是您的代码的工作版本:
library(future)
library(promises)
library(future.callr)
plan(callr)

heavyFunction <- function(n) {
Sys.sleep(n)
print(n)
}

ui <- fluidPage(
br(),
actionButton("go", "Show the data"),
br(), br(),
textOutput("result0sec"),
textOutput("result10sec")
)

server <- function(input, output, session) {
futureData <- reactiveValues(data10 = NULL)

data0 <- eventReactive(input$go, {
heavyFunction(0)
})

observeEvent(input$go, {
myFuture <- future({
heavyFunction(5)
})

then(
myFuture,
onFulfilled = function(value) {
futureData$data10 <<- value
},
onRejected = NULL
)
return(NULL)
})

output$result0sec <- renderText({
data0()
})

output$result10sec <- renderText({
req(futureData$data10)
})
}

shinyApp(ui, server)

这里最重要的一点是要意识到,你不应该直接返回你的 future ,否则它会阻止所有其他 Action ——观察者什么都不返回,它只有触发回调函数的副作用。

关于r - Shiny 的 promise future 不适用于 eventReactive,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53407004/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com