R分配功能调用给两个不同的内核



到目前为止,我在r中读到的有关RADALETING的所有内容都涉及查看一个数据帧的多行。

但是,如果我有2或三个大数据范围,我想执行长功能?我可以将功能的每个实例分配给特定的核心,以便我不必等待它依次工作吗?我在Windows上。

可以说这是功能:

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)
}

我想做的基本上是这个(通用的sudocode):

wait_till_everything_is_finished(
core1="data1 <- AltAlleleRecounter(sampleset1,data1,1)",
core2="data2 <- AltAlleleRecounter(sampleset2,data2,2)",
core3="data3 <- AltAlleleRecounter(sampleset3,data3,3)"
)

所有三个命令正在运行,但在完成所有操作之前,程序才能进行。

编辑:布莱恩的建议奏效了。我用第二个列表替换了"其他名单"。这是示例代码:

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))

数据变量是数据框,名称变量只是字符向量。您可能需要重新加载一些软件包。

尝试这样的东西:

library(doParallel)
library(foreach)
cl<-makeCluster(6) ## you can set up as many cores as you need/want/have here. 
registerDoParallel(cl)
getDoParWorkers() # should be the number you registered. If not, something went wrong.
df1<-data.frame(matrix(1:9, ncol = 3))
df2<-data.frame(matrix(1:9, ncol = 3))
df3<-data.frame(matrix(1:9, ncol = 3))
mylist<-list(df1, df2, df3)
otherList<-list(1, 2, 3)
mylist<-foreach(i=1:3) %dopar% (mylist[[i]] * otherList[[i]])
mylist
[[1]]
X1 X2 X3
1  4  7
2  5  8
3  6  9
[[2]]
X1 X2 X3
2  8 14
4 10 16
6 12 18
[[3]]
X1 X2 X3
3 12 21
6 15 24
9 18 27

我经常使用主题建模不同的数据库进行操作。这个想法是创建要应用您的功能的数据列表,然后让foreach并行应用您的函数。对于您的示例,您必须列出您的data.frames和样本集的另一个列表。

最新更新