我正在尝试使用Shiny和异步编程,希望在更大、更复杂的公共应用程序中使用它。
在这个例子中,我认为unlist()
将等待直到v1
的值返回,因为使用了future_promise
和承诺管道%...>%
。
但是,我得到错误:
Error in unlist: object 'v1' not found
我怎样才能得到这个演示代码的工作?
应用程序。R
library("zeallot")
library("shiny")
library("primes")
library("future")
library("promises")
library("tidyverse")
plan(multisession)
source("/home/law/whatbank_multicore_test/src/expensive_calc.R")
ui <- fluidPage(
actionButton("do", "Do Expensive Calc"),
textOutput("text")
)
server <- function(input, output, session) {
observeEvent(input$do, {
output$text <- renderText({
future_promise(zeallot::`%<-%`(c(v1, v2), expensive_calc()), seed = TRUE) %...>%
{
tmp <- unlist(v1)
}
})
})
}
shinyApp(ui, server)
expensive_calc。R
expensive_calc <- function(){
min <- 10000
max_num <- sample(80000:210000, 1)
rap <- ruth_aaron_pairs(min, max_num, distinct = FALSE)
list(rap, 11)
}
正如在RStudio社区中向我指出的那样,zeallot
调用需要在future_promise
大括号内。解决方案如下:
server <- function(input, output, session) {
observeEvent(input$do, {
output$text <- renderText({
future_promise(seed = TRUE) %...>%
{
zeallot::`%<-%`(c(v1, v2), expensive_calc())
tmp <- unlist(v1)
}
})
})
}