Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Foreach循环找不到对象_R_Foreach_Parallel Processing_Eval - Fatal编程技术网

Foreach循环找不到对象

Foreach循环找不到对象,r,foreach,parallel-processing,eval,R,Foreach,Parallel Processing,Eval,我正在尝试将foreach与并行后端结合使用,以加快计算速度(如果这确实重要的话,{AUCRF}随机林用于特征选择的交叉验证)。在这个过程中,我需要得到一个向量的子集。向量的名称可以更改,但可以作为字符向量访问。我使用eval(parse())构造(好主意?) 例如: library(parallel) library(foreach) library(stats) #create cluster clu <- makeCluster(detectCores() - 1) registe

我正在尝试将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)

我认为每个工作人员都会得到一份包含所有对象的工作区副本。知道我做错了什么吗?

这听起来像是个糟糕的设计。几乎不需要使用
eval(parse())

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

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

foothank为解释eval(parse())和对象导出问题做了大量工作!
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]
}