作为练习,我修改了默认的 Old Faithful Geyser Data 应用程序以合并异步编程。然而,根据我对异步编程的理解,它的行为并不能满足我的期望,我怀疑我存在根本性的误解。
在这里,应用程序创建了 2 个相同的绘图输出。一个比另一个花费更长的时间,但设置为异步工作,另一个很快。
server.R
library(future)
library(promises)
library(shiny)
plan(multisession)
function(input, output) {
bins = reactive({
future({
print("I'm slow")
Sys.sleep(10)
faithful[, 2]
}) %...>%
{seq(min(.), max(.), length.out = input$slow_bins + 1)}
})
output$slow_dist_plot <- renderPlot({
bins() %...>%
{hist(faithful[, 2], breaks = ., col = 'darkgray', border = 'white')}
})
output$fast_dist_plot = renderPlot({
print("I'm fast")
x <-faithful[, 2]
bins = seq(min(x), max(x), length.out = input$fast_bins + 1)
hist(x, breaks = bins, col = 'darkgray', border = 'white')
})
}
ui.R
library(shiny)
fluidPage(
titlePanel("Old Faithful Geyser Data"),
sidebarLayout(
sidebarPanel(
sliderInput("slow_bins",
"Number of slow bins:",
min = 1,
max = 50,
value = 30),
sliderInput('fast_bins',
'fast bins',
min = 1,
max = 50,
value = 30)
),
mainPanel(
plotOutput("slow_dist_plot"),
plotOutput("fast_dist_plot")
)
)
)
基于我对异步编程的理解主要来源于this Rstudio 帖子,如果两个用户同时运行此代码,在两个图的初始绘图之后,如果其中一个用户更改慢速箱,另一个用户应该可以自由地使用快速箱并获得即时图因为其他用户请求由新流程处理。
但是,当我实际尝试使用两个窗口进行此操作时,我发现每当我在慢速容器中进行更改时,其他窗口都必须等待慢速容器完成。这里出了什么问题?是我的期望有误还是我设置有误?
最佳答案
问题中的预期行为是正确的。但是,在单核机器上,使用 multisession
计划时,worker 的数量默认设置为 1。做
plan(multisession,workers = 2)
将具有预期的行为。提高这个数字对于正在使用的应用程序来说可能是必要的。
关于r - 异步 Shiny 编程 - 设置一个基本示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52864035/