【问题标题】:How to pass "..." arguments to a function called from foreach()?如何将“...”参数传递给从 foreach() 调用的函数?
【发布时间】:2013-01-05 00:13:12
【问题描述】:

以下代码产生警告:

Warning message:
<anonymous> : <anonymous>: ... may be used in an incorrect context: ‘mean(x[l], ...)’

doForeach <- function(x, ...)
{
    require(doSNOW)
    require(foreach)
    cl <- snow::makeCluster(2, type="MPI")
    on.exit(snow::stopCluster(cl))
    registerDoSNOW(cl)
    do.i <- function(i) lapply(seq_len(length(x)), function(l) mean(x[l], ...))
    foreach(i=seq_len(10)) %dopar% { do.i(i) }
}
x <- rnorm(20)
r <- doForeach(x, trim=1)

我猜这是因为工人/奴隶不再看到...。形式参数通常作为字符向量通过.export=c("&lt;arg&gt;") 传递,但这似乎不适用于... 参数。

在本例中处理... 参数的正确方法是什么?

【问题讨论】:

  • 这将有助于尽可能减少它,同时仍然会产生错误。 doSNOWforeach 包可能不需要复制问题,这将大大简化问题 - 并可能导致更快的解决方案。问题可能是lapply 还指定了...
  • 如果你用do替换dopar,计算是按顺序完成的——然后它就可以工作了,所以它可能来自foreach
  • 好的,我只是稍微简化了示例并解释了我认为错误的位置。

标签: r foreach parallel-processing


【解决方案1】:

好的,显然... 参数必须通过do.i 传递。这是一个更明显(并且运行正确)的示例:

doForeach <- function(x, ...)
{
    require(doSNOW)
    require(foreach)
    cl <- snow::makeCluster(2, type="MPI")
    on.exit(snow::stopCluster(cl))
    registerDoSNOW(cl)
    do.i <- function(i, ...) lapply(seq_len(length(x)), function(l) max(x[l], ...))
    foreach(i=seq_len(5)) %dopar% { do.i(i, ...) }
}
x <- 1:3
doForeach(x, 1.5)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-07
    • 2021-07-27
    • 2022-01-25
    • 1970-01-01
    • 2020-05-06
    • 2012-05-21
    • 1970-01-01
    相关资源
    最近更新 更多