gpt4 book ai didi

r - Foreach循环无法找到对象

转载 作者:行者123 更新时间:2023-12-01 23:17:44 25 4
gpt4 key购买 nike

我正在尝试将 foreach 与并行后端一起使用来加速计算(如果这很重要,则对 {AUCRF} 随机森林进行交叉验证以进行特征选择)。在这样做的过程中,我需要得到一个向量的子集。向量的名称可以更改,但可以作为字符向量访问。我使用 eval(parse()) 构造(好主意?)来获取向量的子集。

例子:

library(parallel)
library(foreach)
library(stats)

#create cluster
clu <- makeCluster(detectCores() - 1)
registerDoParallel(clu, cores = detectCores() - 1)

bar<-c("a","b","c","d")
rab<-c(2,3)
bar.name<-"bar"

#expected output in this example is a list containing ten times
bar[rab]
#or
eval(parse(text=paste(bar.name,"[rab]",sep="")))

foo<-foreach(m = 1:10, .packages = c("stats")) %dopar% {
sink("foreach.txt")
print(bar.name)
print(parse(text=paste(bar.name,"[rab]",sep="")))
print(eval(parse(text=paste(bar.name,"[rab]",sep=""))))
foo.temp<-eval(parse(text=paste(bar.name,"[rab]",sep="")))
return(foo.temp)
}
sink()
stopCluster(clu)

但是我收到以下错误:
Error in { : task 1 failed - "Object 'bar' not found"

我认为每个 worker 都获得了包含所有对象的工作区副本。知道我做错了什么吗?

最佳答案

这听起来像一个糟糕的设计。几乎没有必要使用 eval(parse()) .

要获取变量,get()更安全一些,比如 get(bar.name)[rab] .但是您仍然在这里遇到环境问题。由于您没有变量 barrabdopar的正文中,它们不会导出到 foreach 所在的环境中正在运行代码。您可以通过显式分配 .export 来解决这个问题。 foreach 的参数以确保导出这些变量。这里我改用get并且只需要明确导出 bar因为 rab现在包含在函数的框中。

foo<-foreach(m = 1:10, .export=c("bar"), .packages = c("stats")) %dopar% {
get(bar.name)[rab]
}

一个更好的主意不是指定变量名,而是指定命名列表的元素。例如
baz <- list(bar=letters[1:4], bob=letters[5:7])

那么你可以做
baz.name <- "bar"
rab <- c(2,4)

foo<-foreach(m = 1:10, .packages = c("stats")) %dopar% {
baz[[baz.name]][rab]
}

并且因为 dopar 可以看到变量 baz , baz.name , 和 rab你不必导出任何东西。

关于r - Foreach循环无法找到对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28200982/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com