我有一个返回 (numVals x N) 数组/矩阵的函数。该函数需要评估 K 次。我的目标是将所有结果存储在包含形状为 c(numVals, N, K) 的双精度数的 R 数组中。
我无法为 .combine (或 foreach 的其他参数)找到合适的参数,以使其返回值采用正确的格式。我意识到我可以继续并稍后重塑 foreach 返回的 2d,但我遇到了内存限制(并且我不确定我是否可以在没有任何内存开销的情况下就地重塑。
我正在寻找的解决方案可以是 foreach (或与 dopar 兼容的类似函数)输出 3d 或重塑为正确的格式,而无需创建另一个内存占用与结果一样大的对象。
这是一个代码片段:
rm(list = ls())
library(doParallel)
library(doRNG)
registerDoParallel(cores = 3)
registerDoRNG(12345)
run_tasks <- function(k, N, numVals) {
return(matrix(runif(numVals * N), numVals, N))
}
K <- 10000
N <- 40
numVals <- 10
# Run the simulation
results <-
foreach(k = 1:K, .combine = rbind) %dorng% run_tasks(k, N, numVals)
# Desired output format
# results <- array(NA, c(numVals, N, K))
根本不要使用
.combine
,然后再制作array
。默认情况下,foreach
以列表形式返回结果,.combine
只是一个方便的参数。
> results <- foreach(k = 1:K) %dorng% run_tasks(k, N, numVals)
> A <- array(unlist(results), dim=c(numVals, N, K))
> dim(A)
[1] 10 40 10000
> all.equal(A[,,1], results[[1]])
[1] TRUE