在foreach dopar循环中更改data.frame对象

时间:2019-09-09 17:36:38

标签: r

我需要并行处理一些R代码,并且我打算使用foreach函数来使用%dopar%库。

我想在data.frame中添加列,我也不希望foreach在完成循环后打印出结果。

请注意,我并不是在询问执行此操作的最佳方法,示例代码只是为了演示我要执行的操作。

我已经尝试了下面示例中的代码,但是它不会更新data.frame,其次它返回打印出的data.frame。

library(foreach)
library(doParallel)

cl<-makeCluster(8)
registerDoParallel(cl)

data <- iris

foreach(i=1:(ncol(data)- 1)) %dopar% {
  data[,paste0(names(data),"_1")] <- data[,i + 1]
}

我希望循环的输出在每次迭代时向data.frame中添加一个新列,并返回具有4个以上列的data.frame。

1 个答案:

答案 0 :(得分:1)

您无法更改原始数据帧,因为数据是分别传递到每个节点的,并且每个节点都在不同的环境中工作。

相反,请基于原始数据框创建一个新的数据框。

library(foreach)
library(doParallel)

cl<-makeCluster(8)
registerDoParallel(cl)

data <- iris

result <- foreach(i=1:(ncol(data)- 1),
        .init = data,
        .combine = cbind) %dopar% {
    out <- data[,i + 1,drop = FALSE]
    colnames(out) <- paste0(colnames(out),"_1")
    return(out)
        }