我需要并行处理一些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。
答案 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)
}