Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 并行软件包在软件中的应用_R_Parallel Processing_Shiny - Fatal编程技术网

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))
    })
  }