代码之家  ›  专栏  ›  技术社区  ›  Jim Maas

为R包编译准备嵌套foreach循环时出错

  •  1
  • Jim Maas  · 技术社区  · 7 年前

    描述这一点最简单的方法是显示代码。我有一个嵌套的foreach循环,可以很好地工作,尝试将其编译为R包,从而删除代码中的“library(foreach)”。我的函数如下所示:

    Calcs <- function (...) {
    results <- data.frame (foreach::foreach (j = 1:NumSim, .combine = acomb,
                                    .options.mpi=opts1)
                           %:%
                           foreach::foreach (i = 1:PopSize, .combine=rbind,
                                    .options.mpi=opts2,
                                    .export = c (ls(globalenv())),
                                    .packages = c("zoo", "msm", "FAdist"))
                           foreach::`%dopar%` {
    
    
                               output <- if(rbinom(1,1,ProSecPos) > 0)
                                      replicate(DayNum, eval(call("PrbInfBep")))
                                      else rep(0, DayNum)
    
                               output2 <- data.frame(khf(output))
                           }
                           )
    

    我在第二个“foreach:foreach”语句的开头出现了一个“意外的符号”错误,如下所示。

      ./functions/Parallel.R:19:28: unexpected symbol
    18:                                     .packages = c("zoo", "msm", "FAdist"))
    19:                            foreach
                                   ^
    

    foreach::foreach:: %dopar%`

    2 回复  |  直到 7 年前
        1
  •  1
  •   F. Privé    7 年前

    我想 foreach foreach:: #' @import foreach 文档

    收件人:

    library(foreach)
    test1 <- foreach::foreach (j = 1:20, .combine = c) %:%
      foreach::foreach(i = 1:10, .combine = c) %do% {
        i * j 
      }
    

    你能做到的

    test2 <- foreach::`%do%`(
      foreach::`%:%`(foreach::foreach(j = 1:20, .combine = c),
                     foreach::foreach(i = 1:10, .combine = c)), 
      {
        i * j 
      }
    )
    
    all.equal(test1, test2)
    

    PS:你会收到一张关于 i j globalVariables(c("i", "j")) 在你包裹里的某个地方。

        2
  •  1
  •   Jesus    7 年前

    在每一秒之后,你都没有一个%:%。请尝试使用此符号。。。

    对于嵌套的foreach,应始终使用:

    matrix<-foreach()%:%
    foreach()%:%
    foreach()%dopar%{
    
    }