R: doSNOW/foreach 创建列表列表
R: doSNOW/foreach create list of list
您好,我想使用 doSNOW/foreach 包创建一个命名列表。例如,最终产品将是一个列表对象。从矢量命名的 dfe 说,
n=c("n1","n2","n3","n4","n5")
这样我就可以像 dfe[["n1"]]$a
一样访问列表对象的列表,其中 a 是列表中的一个元素。
这是我所说的一个例子。
mainStart <- Sys.time()
n=c("n1","n2","n3","n4","n5")
cores=detectCores()
cl <- parallel::makeCluster(cores[1]-1) #not to overload your computer
registerDoSNOW(cl)
## setup progress bar
pb <- txtProgressBar(max = 5, style = 3)
progress <- function(n) setTxtProgressBar(pb, n)
opts <- list(progress = progress)
dfe <- foreach(id.this = n, .combine = list, .options.snow = opts) %dopar% {
list ( a=c(1,2,3), b = c(1,2,3))
}
endTime <- Sys.time()
endTime -mainStart
close(pb)
stopCluster(cl)
因此,如果我在 foreach 循环中创建的列表可以在循环后命名和访问,那就太好了。这样 dfe[["n1"]]$a 可以给我向量 1,2,3。
如上所示,仅设置名称 (dfe, n) 更容易,但我认为这行不通,因为某些进程可能比其他进程花费的时间更长,但顺序似乎没有改变。例如当我设置
if ( id.this == "n2"){
Sys.sleep(10)
}
订单仍然保留。所以最终代码会是这样的。
mainStart <- Sys.time()
n=c("n1","n2","n3","n4","n5")
cores=detectCores()
cl <- parallel::makeCluster(cores[1]-1) #not to overload your computer
registerDoSNOW(cl)
## setup progress bar
pb <- txtProgressBar(max = 4, style = 3)
progress <- function(n) setTxtProgressBar(pb, n)
opts <- list(progress = progress)
dfe <- foreach(id.this = n, .options.snow = opts) %dopar% {
#list(id.this = list( a=c(1,2,3), b = c(1,2,3) ) )
if ( id.this == "n2"){
Sys.sleep(10)
}
list( a=c(id.this,2,3), b = c(1,2,3) )
}
endTime <- Sys.time()
endTime -mainStart
close(pb)
stopCluster(cl)
dfe=setNames(dfe, n)
您好,我想使用 doSNOW/foreach 包创建一个命名列表。例如,最终产品将是一个列表对象。从矢量命名的 dfe 说,
n=c("n1","n2","n3","n4","n5")
这样我就可以像 dfe[["n1"]]$a
一样访问列表对象的列表,其中 a 是列表中的一个元素。
这是我所说的一个例子。
mainStart <- Sys.time()
n=c("n1","n2","n3","n4","n5")
cores=detectCores()
cl <- parallel::makeCluster(cores[1]-1) #not to overload your computer
registerDoSNOW(cl)
## setup progress bar
pb <- txtProgressBar(max = 5, style = 3)
progress <- function(n) setTxtProgressBar(pb, n)
opts <- list(progress = progress)
dfe <- foreach(id.this = n, .combine = list, .options.snow = opts) %dopar% {
list ( a=c(1,2,3), b = c(1,2,3))
}
endTime <- Sys.time()
endTime -mainStart
close(pb)
stopCluster(cl)
因此,如果我在 foreach 循环中创建的列表可以在循环后命名和访问,那就太好了。这样 dfe[["n1"]]$a 可以给我向量 1,2,3。
如上所示,仅设置名称 (dfe, n) 更容易,但我认为这行不通,因为某些进程可能比其他进程花费的时间更长,但顺序似乎没有改变。例如当我设置
if ( id.this == "n2"){
Sys.sleep(10)
}
订单仍然保留。所以最终代码会是这样的。
mainStart <- Sys.time()
n=c("n1","n2","n3","n4","n5")
cores=detectCores()
cl <- parallel::makeCluster(cores[1]-1) #not to overload your computer
registerDoSNOW(cl)
## setup progress bar
pb <- txtProgressBar(max = 4, style = 3)
progress <- function(n) setTxtProgressBar(pb, n)
opts <- list(progress = progress)
dfe <- foreach(id.this = n, .options.snow = opts) %dopar% {
#list(id.this = list( a=c(1,2,3), b = c(1,2,3) ) )
if ( id.this == "n2"){
Sys.sleep(10)
}
list( a=c(id.this,2,3), b = c(1,2,3) )
}
endTime <- Sys.time()
endTime -mainStart
close(pb)
stopCluster(cl)
dfe=setNames(dfe, n)