应该可以使用R包future并promises通过Shiny应用程序触发异步(长时间运行)处理,而不会冻结应用程序的其余部分,而异步进程在另一个R进程中运行.
看到:
https://cran.r-project.org/web/packages/promises/vignettes/intro.html
https://cran.r-project.org/web/packages/promises/vignettes/overview.html
https://cran.r-project.org/web/packages/promises/vignettes/futures.html
https://cran.r-project.org/web/packages/promises/vignettes/shiny.html
Run Code Online (Sandbox Code Playgroud)
我让它在基于R脚本的环境中工作,但是当我实现一个带有2个函数的简单闪亮应用程序时,无法使其工作.在异步功能运行时,"非异步"功能始终被阻止,但情况并非如此.
我在包的GitHub回购中发布了相同的问题promises:https://github.com/rstudio/promises/issues/23
我在这里发帖也希望有人可以提供帮助.
问题是:
Mac OS 10.12
$ R --version
R version 3.4.3 (2017-11-30) -- "Kite-Eating Tree"
remove.packages("future")
remove.packages("promises")
remove.packages("shiny")
install.packages("future")
install.packages("devtools")
devtools::install_github("rstudio/promises")
devtools::install_github("rstudio/shiny")
> packageVersion("future")
[1] ‘1.8.1’
> packageVersion("promises")
[1] ‘1.0.1’
> packageVersion("shiny")
[1] ‘1.0.5.9000’
Run Code Online (Sandbox Code Playgroud)
关于闪亮软件包版本的一个问题,https://rstudio.github.io/promises/articles/intro.html说它应该> = 1.1,但即使使用devtools安装,版本仍然是1.0.5 .... 这是一个问题还是文档中有拼写错误?
首先,你可以使用带有闪亮输出的promises.如果您使用的是异步兼容版本的Shiny(版本> = 1.1),则所有内置的renderXXX函数都可以处理常规值或承诺.
我已经实现了这个简单的闪亮应用程序,灵感来自上面提到的URL的示例.闪亮的应用程序有2个"部分":
read_csv_async休眠几秒钟的函数模拟的,将csv文件读入数据帧.然后在按钮下方呈现df.问题是在执行异步处理时会阻止第二个功能(直方图更新).
global.R
library("shiny")
library("promises")
library("dplyr")
library("future")
# path containing all …Run Code Online (Sandbox Code Playgroud) 我有一个 inputButton,当您单击它时,完成了对 mysql 数据库的 2 次查询。一个是重的(超过 10 秒),另一个是轻的(小于 0.01 秒获取数据)。
由于我想在闪亮的应用程序上显示此查询的结果,因此我打算使用 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)
Run Code Online (Sandbox Code Playgroud)
我做错了什么?