运行 foreach 不在 R 中返回任何值

Running foreach without returning any value in R

我有一个函数 doSomething(),它 运行 在 foreach 循环中,因此将一些计算保存为 .csv 文件。因此,我不需要 foreach 的 return 值,事实上我不想要 return 值,因为它使我的记忆变得杂乱无章,以至于我无法 运行 尽可能多的迭代我愿意。

如何强制 foreach 没有 return 值,或删除迭代的 return 值?

这是一个说明我的问题的最小示例:

cl <- parallel::makePSOCKcluster(1)
doParallel::registerDoParallel(cl)

"%dopar%" <- foreach::"%dopar%"

doSomething <- function () {
  a <- as.numeric(1L)
}

foreach::foreach (i = 1:4) %dopar% {

  doSomething()

}

输出为:

[[1]]
[1] 1

[[2]]
[1] 1

[[3]]
[1] 1

[[4]]
[1] 1

来自?foreach

The foreach and %do%/%dopar% operators provide a looping construct that can be viewed as a hybrid of the standard for loop and lapply function. It looks similar to the for loop, and it evaluates an expression, rather than a function (as in lapply), but it's purpose is to return a value (a list, by default), rather than to cause side-effects.

but it's purpose is to return a value (a list, by default)

表示这是 foreach 的预期行为。不确定你想如何继续...

达里奥指出; foreach returns 一个列表。因此,您要做的是改用 for 循环。您可以在循环中使用 write.csv 函数将每次迭代的结果写入 csv 文件。

对于并行计算,尝试使用 parallel 包中的 parSapply 函数:

library(parallel)
cl <- parallel::makePSOCKcluster(1)
doParallel::registerDoParallel(cl)
parSapply(cl, 1:4, function(doSomething) a <- as.numeric(1L))

编辑;

结合 Freakozoid 的建议(将 rm 函数的参数设置为 a);

library(parallel)
cl <- parallel::makePSOCKcluster(1)
doParallel::registerDoParallel(cl)
parSapply(cl, 1:4, function(doSomething) {a <- as.numeric(1L); write.csv(a, "output.csv"); rm()})

将为您提供作为 csv 文件的结果输出,以及 NA 的列表。由于列表仅包含 NAs,因此可能不需要很多 space.

请告诉我结果。

R 中的并行计算工作(据我所知),以便为每个集群节点分配内存。

这意味着如果你有一个大数据集,每个节点都需要计算,这个数据将被分配多次。这会导致高 RAM 消耗。由于您想在每个循环中写入输出并在之后丢弃结果,您可以尝试 rm 函数并在每个函数调用中调用垃圾收集(例如使用 gc)。

如上所述,这适用于 E L M。感谢测试!

正如其他提到的,如果您只对函数的 side-effects 感兴趣,最后返回 NULL 不会保存任何输入,节省 RAM。

如果最重要的是,你想减少视觉混乱(避免列出 100 NULL),你可以使用 .final 参数,将其设置为 .final = function(x) NULL.

library(foreach)
doSomething <- function ()  as.numeric(1L)

foreach::foreach(i = 1:4, .final = function(x) NULL) %do% {
  
  doSomething()
}
#> NULL

reprex package (v2.0.1)

于 2022-05-24 创建