最简单的描述方法是显示代码。我有一个嵌套的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%`
答案 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:你会抱怨i
和j
。要删除它,您可以在包中的某处添加globalVariables(c("i", "j"))
。