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

为R包编译准备嵌套的foreach循环时出错,r,foreach,r-package,R,Foreach,R Package,描述这一点的最简单方法是显示代码。我有一个嵌套的foreach循环,可以很好地工作,试图准备编译为一个R包,从而删除代码中的“library(foreach)”。我的函数如下所示: Calcs <- function (...) { results <- data.frame (foreach::foreach (j = 1:NumSim, .combine = acomb, .options.mpi=opts1)

描述这一点的最简单方法是显示代码。我有一个嵌套的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::
%dopar%`

在第二个foreach中,后面没有%:%。请用这个符号试试

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

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

}

matrix我认为
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 
  }
库(foreach)

test1 Thx,尝试了它,现在得到了这个消息“foreach中的错误::foreach(j=1:NumSim,.combine=acomb,.options.mpi=opts1)%:%:找不到函数“%dopar%”,我在这里遵循以前的解决方案,他们使用foreach解决了这个问题::
%doapr
,但它对我不起作用。要明确的是,我还没有构建包,只是试图让代码在不加载整个包的情况下运行。Thx。。。“嵌套的”foreach循环的正确表示法是foreach(…)%:%foreach(…)%dopar%{},%:%是“嵌套的”运算符,多年来一直正确地为我工作。我完全按照你说的做了,除了你展示了三个层次的嵌套,我的只有两个。。。。我认为。这很有效,你是对的,它不漂亮,而且有点难以遵循逻辑和语法。。。但它是有效的。做得好。实际上,文档中的逻辑是可以理解的:')我相信你是正确的,你能给我们发一个文档链接吗,我找不到它<代码>?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)