R 并行软件包在软件中的应用
我正在为我创建的模拟器创建一个闪亮的应用程序。为了加快模拟速度,我使用了R 并行软件包在软件中的应用,r,parallel-processing,shiny,R,Parallel Processing,Shiny,我正在为我创建的模拟器创建一个闪亮的应用程序。为了加快模拟速度,我使用了并行包 我的应用程序在不并行我的代码时运行良好,尽管速度很慢。但是,当我并行化时,我得到以下错误: Error in checkForRemoteErrors(val) : 3 nodes produced errors; first error: Operation not allowed without an active reactive context. (You tried to do something t
并行
包
我的应用程序在不并行我的代码时运行良好,尽管速度很慢。但是,当我并行化时,我得到以下错误:
Error in checkForRemoteErrors(val) :
3 nodes produced errors; first error: Operation not allowed without an active reactive context. (You tried to do something that can only be done from inside a reactive expression or observer.)
以下是my ui.R和server.R的简略版本:
用户界面
服务器.R
cl既然你没有提供答案,那就更像是胡乱猜测了
当您调用clusterExport
时,将在集群上分布反应变量parSapply
在集群上执行simulate\u bitcoin\u Twoway
,为每个工作人员提供单独的环境,而不封闭反应式
块。由于被动值需要被动上下文,所以整个操作失败
为了解决这个问题,我将尝试在本地计算反应式表达式并分发返回值:
gameResults <- reactive({
firm1bits_v <- firm1bits()
firm2bits_v <- firm2bits()
firm1max_v <- firm1max()
firm2max_v <- firm2max()
clusterExport(cl, varlist=c(
"firm1bits_v", "firm2bits_v", "firm1max_v", "firm2max_v"))
parSapply(cl, 1:1000, function(i ){
simulate_bitcoin_Twoway(firm1bits_v, firm2bits_v, firm1max_v, firm2max_v)
})
})
请注意clusterExport
的envir
参数。默认情况下,clusterExport
在全局环境中搜索,其中闭包中定义的变量不可见 尽管我使用的是doParallel
和foreach
软件包,但我遇到了完全相同的问题。我没有在我的应用程序中明确定义任何反应值,但我在foreach块中引用了input
,这当然是默认的反应值
在尝试了许多不同的方法之后,我发现最简单的解决方案是在foreach
中简单地包含一个isolate
语句。但是,由于隔离使这些变量不依赖于foreach循环之外的任何东西,因此我们需要导出输入
向量以及隔离
函数本身。在您的情况下,还需要导出所有反应值
给我错误的代码
如果没有活动-反应上下文,则不允许操作
看起来是这样的:
optiResults<-foreach(i=seq(1,3),
.combine = rbind,
) %dopar% {
print("hello")
rv = input$power
thingy = data.frame(matrix(0,1,2))
}
OptiResults我有这个用例和同样的问题。我使用的是doParallel
和foreach
。
gameResults <- reactive({
firm1bits_v <- firm1bits()
firm2bits_v <- firm2bits()
firm1max_v <- firm1max()
firm2max_v <- firm2max()
clusterExport(cl, varlist=c(
"firm1bits_v", "firm2bits_v", "firm1max_v", "firm2max_v"))
parSapply(cl, 1:1000, function(i ){
simulate_bitcoin_Twoway(firm1bits_v, firm2bits_v, firm1max_v, firm2max_v)
})
})
library(shiny)
library(parallel)
library(ggplot2)
cl <- makeCluster(detectCores()-1, 'PSOCK')
sim <- function(x, y, z) {
c(rnorm(1, mean=x), rnorm(1, mean=y), rnorm(1, mean=z))
}
shinyApp(
ui=shinyUI(bootstrapPage(
numericInput("x", "x", 10, min = 1, max = 100),
numericInput("y", "y", 10, min = 1, max = 100),
numericInput("z", "z", 10, min = 1, max = 100),
plotOutput("plot")
)),
server=shinyServer(function(input, output, session){
output$plot <- renderPlot({
x <- input$x
y <- input$y
z <- input$z
clusterExport(
cl, varlist=c("x", "y", "z", "sim"),
envir=environment())
mat <- t(parSapply(cl, 1:1000, function(i) {
sim(x, y, z)
}))
ggplot(
as.data.frame(mat),
aes(x=V1, y=V2, col=cut(V3, breaks=10))) + geom_point()
})
})
)
optiResults<-foreach(i=seq(1,3),
.combine = rbind,
) %dopar% {
print("hello")
rv = input$power
thingy = data.frame(matrix(0,1,2))
}
optiResults<-foreach(i=seq(1,3),
.combine = rbind,
.export = c("isolate","input")
) %dopar% {
print("hello")
isolate({
rv = input$power
thingy = data.frame(matrix(0,1,2))
})
}