【问题标题】:error when preparing nested foreach loops for R package compile为 R 包编译准备嵌套的 foreach 循环时出错
【发布时间】:2017-08-23 13:16:19
【问题描述】:

描述这一点的最简单方法是显示代码。我有一个工作正常的嵌套 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%这样聪明的东西`

【问题讨论】:

  • Thx,试了一下,现在收到此消息“foreach::foreach 中的错误(j = 1:NumSim,.combine = acomb,.options.mpi = opts1)%:%:找不到function "%dopar%" ",我在这里遵循以前的解决方案,他们确实通过使用 foreach::%doapr 解决了问题,但它对我不起作用。需要说明的是,我还没有构建包,只是试图让代码在不加载整个包的情况下运行。

标签: r foreach r-package


【解决方案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"))

【讨论】:

  • 效果很好,你是对的,它不漂亮,而且有点难以遵循逻辑和语法......但它有效。干得好。
  • 其实用文档可以理解逻辑:')
  • 我确定你是对的,你能给我们发个文档链接吗,我没找到!
  • ?foreach::foreach
【解决方案2】:

在第二个 foreach 之后,您没有 %:% 。请尝试使用这种表示法...

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

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

}

【讨论】:

  • Thx ...“嵌套”foreach 循环的正确表示法是 foreach (...) %:% foreach (...) %dopar% { } ,%:% 是“嵌套”运算符,并且多年来一直为我正常工作。我已经完全按照你说的做了,除了你展示了 3 层嵌套,我的只有两层....我想。
猜你喜欢
  • 2019-07-13
  • 2016-05-28
  • 1970-01-01
  • 2012-03-29
  • 1970-01-01
  • 1970-01-01
  • 2019-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多