为 R 包编译准备嵌套的 foreach 循环时出错
error when preparing nested foreach loops for R package compile
最简单的描述方式是显示代码。我有一个工作正常的嵌套 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" 语句的开头收到 "unexpected symbol" 错误。
./functions/Parallel.R:19:28: unexpected symbol
18: .packages = c("zoo", "msm", "FAdist"))
19: foreach
^
出于某种奇怪的原因,它似乎对“%:%”很满意,或者它只是还没有恢复到那个错误。我需要像 foreach::foreach::
%dopar%`
这样聪明的东西吗
在第二个 foreach 后面没有 %:%。请尝试使用此表示法...
对于嵌套的 foreach,您应该始终使用:
matrix<-foreach()%:%
foreach()%:%
foreach()%dopar%{
}
我认为 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"))
。
最简单的描述方式是显示代码。我有一个工作正常的嵌套 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" 语句的开头收到 "unexpected symbol" 错误。
./functions/Parallel.R:19:28: unexpected symbol
18: .packages = c("zoo", "msm", "FAdist"))
19: foreach
^
出于某种奇怪的原因,它似乎对“%:%”很满意,或者它只是还没有恢复到那个错误。我需要像 foreach::foreach::
%dopar%`
在第二个 foreach 后面没有 %:%。请尝试使用此表示法...
对于嵌套的 foreach,您应该始终使用:
matrix<-foreach()%:%
foreach()%:%
foreach()%dopar%{
}
我认为 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"))
。