Rap*_*nns 12 asynchronous r shiny
应该可以使用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 files, including ui.R and server.R
setwd("/path/to/my/shiny/app/dir")
plan(multiprocess)
# A function to simulate a long running process
read_csv_async = function(sleep, path){
log_path = "./mylog.log"
pid = Sys.getpid()
write(x = paste(format(Sys.time(), "%Y-%m-%d %H:%M:%OS"), "pid:", pid, "Async process started"), file = log_path, append = TRUE)
Sys.sleep(sleep)
df = read.csv(path)
write(x = paste(format(Sys.time(), "%Y-%m-%d %H:%M:%OS"), "pid:", pid, "Async process work completed\n"), file = log_path, append = TRUE)
df
}
Run Code Online (Sandbox Code Playgroud)
ui.R
fluidPage(
actionButton(inputId = "submit_and_retrieve", label = "Submit short async analysis"),
br(),
br(),
tableOutput("user_content"),
br(),
br(),
br(),
hr(),
sliderInput(inputId = "hist_slider_val",
label = "Histogram slider",
value = 25,
min = 1,
max = 100),
plotOutput("userHist")
)
Run Code Online (Sandbox Code Playgroud)
server.R
function(input, output){
# When button is clicked
# load csv asynchronously and render table
data_promise = eventReactive(input$submit_and_retrieve, {
future({ read_csv_async(10, "./data.csv") })
})
output$user_content <- renderTable({
data_promise() %...>% head(5)
})
# Render a new histogram
# every time the slider is moved
output$userHist = renderPlot({
hist(rnorm(input$hist_slider_val))
})
}
Run Code Online (Sandbox Code Playgroud)
data.csv
Column1,Column2
foo,2
bar,5
baz,0
Run Code Online (Sandbox Code Playgroud)
谢谢!
所以这种行为是正常的,请参阅包开发人员的响应 https://github.com/rstudio/promises/issues/23
概括:
在闪亮的应用程序中,一个 R 进程可以由多个用户共享。如果一个用户提交了一项长时间运行的任务,则共享同一底层 R 进程的所有其他用户都会被阻止。的目标promises是避免这种情况。因此promises将防止一个 R 进程内的“用户会话”之间发生阻塞,但不会在单个“用户会话”内发生阻塞。
该软件包的作者提到,尚不支持此功能,如果有足够多的人要求它,可能会添加它。如果您正在寻找此内容,请访问 GitHub 问题并喜欢原始问题 - 这就是衡量新功能兴趣的方式。
谢谢!