0
到目前为止,我所读过的有关R中的并行处理的内容涉及查看一个数据帧的多行。R将函数调用分配给两个不同的内核
但是如果我有两个或三个大型数据框要执行长功能呢?我可以将函数的每个实例分配给特定的核心,因此我不必等待它顺序工作?我在窗户上。
让我们说这是功能:
AltAlleleRecounter <- function(names,data){
data$AC <- 0
numalleles <- numeric(length=nrow(data))
for(i in names){
genotype <- str_extract(data[,i],"^[^/]/[^/]")
GT <- dstrfw(genotype,c('character','character','character'),c(1L,1L,1L))
data[GT$V1!='.',]$AC <- data[GT$V1!='.',]$AC+GT[GT$V1!='.',]$V1+GT[GT$V1!='.',]$V3
numalleles[GT$V1!='.'] <- numalleles[GT$V1!='.'] + 2
}
data$AF <- data$AC/numalleles
return(data)
}
我想要做的基本上是这样的(通用伪码):
wait_till_everything_is_finished(
core1="data1 <- AltAlleleRecounter(sampleset1,data1,1)",
core2="data2 <- AltAlleleRecounter(sampleset2,data2,2)",
core3="data3 <- AltAlleleRecounter(sampleset3,data3,3)"
)
所有三个命令正在运行,但程序不进展到一切完成。编号: Bryan的建议奏效。我用第二个列表替换了“otherList”。这是示例代码:
myframelist <- list(data1,data2)
mynameslist <- list(names1,names2)
myframelist <- foreach(i=1:2) %dopar% (AltAlleleRecounter(mynameslist[[i]],myframelist[[i]]))
myfilenamelist <- list("data1.tsv","data2.tsv")
foreach(i=1:2) %dopar% (write.table(myframelist[[i]], file=myfilenamelist[[i]], quote=FALSE, sep="\t", row.names=FALSE, col.names=TRUE))
数据变量是数据框,名称变量只是字符向量。您可能需要重新加载一些软件包。
可能是我收到的最直接有用的答案。谢谢。 – eugheugh
出于某种原因,即使我导出全局环境,我的加载库也没有在并行处理中被识别,所以我必须在函数中再次加载它们,但它可以工作。 – eugheugh
您可以在'foreach'调用中添加参数'.packages = foo',它会将您的库加载到每个核心上。 –