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

时间:2017-08-23 13:16:20

标签: r foreach r-package

最简单的描述方法是显示代码。我有一个嵌套的foreach循环,工作正常,尝试编译为R包,从而删除代码中的“库(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 个答案:

答案 0 :(得分:1)

在第二次预告中,你没有%:%。请试试这个表示法......

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

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

}

答案 1 :(得分:1)

我认为foreach使用了一些非标准的评估,因此只需在所有内容之前添加foreach::就不能直接在包中使用。你可以轻松做的是在 roxygen2 文档中使用#' @import foreach

如果你真的想使用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:你会抱怨ij。要删除它,您可以在包中的某处添加globalVariables(c("i", "j"))