我知道如何将变量导出到使用
parallel
和 doSNOW
注册的集群上。
我不明白的是:如果我事先不知道它们的变量名称,如何访问这些变量(例如使用
clusterEvalQ
或 clusterCall
)。
举下面这个人为的例子:
do_something_parallel <- function(chosen_letter){
a = 1
b = 2
c = 3
cl <- parallel::makeCluster(2)
doSNOW::registerDoSNOW(cl)
# Export selected letter on clusters
parallel::clusterExport(cl, chosen_letter, envir = environment())
# Desired behavior here: multiply selected letter by x2
}
do_something_parallel("a")
do_something_parallel("b")
do_something_parallel("c")
用户可以使用
a
参数选择 b
、c
或 chosen_letter
,并将其导出到集群中。但是,如果他们想要将其乘以 2,那么如何才能访问 chosen_letter
呢?
我想过尝试使用
parse
和 eval
生成表达式并将其发送到 clusterEvalQ
但没有取得任何成果。
do_something_parallel <- function(chosen_letter){
x <- list(a = 1, b = 2, c = 3)
y <- x[[chosen_letter]]
cl <- parallel::makeCluster(2)
on.exit(parallel::stopCluster(cl))
doSNOW::registerDoSNOW(cl)
# Export selected letter on clusters
parallel::clusterExport(cl, "y", envir = environment())
parallel::clusterEvalQ(cl, y * 2)
}
do_something_parallel("a")
#[[1]]
#[1] 2
#
#[[2]]
#[1] 2
do_something_parallel("b")
#[[1]]
#[1] 4
#
#[[2]]
#[1] 4
do_something_parallel("c")
#[[1]]
#[1] 6
#
#[[2]]
#[1] 6