Foreach不执行IF语句
问题描述:
我在我的R代码的多个for
语句之一中实现了foreach
。它返回主结果(所有迭代之后的结果),但是它不会在代码中执行IF语句。Foreach不执行IF语句
在我的代码的框架下(它放置所有内容太长)。if
语句不起作用,变量“Disc_Time”保持不变(如初始化)。我做错了什么或失踪?我试着用.export =“f”和.export = ls(GlovalEnv),但没有成功。
library(foreach)
library(doParallel)
cores=detectCores()
cl <- makeCluster(cores[1]-1) #not to overload your computer
registerDoParallel(cl)
Disc_Time<-c("UE","Beam_order","Time")
.... MORE VARIABLES
MDP_x<-foreach (d = 1:length(dista),.combine='c')%dopar%
{
for (q in 1:sim)
{
for (ue in 1:n)
{
for (i in 1:length(seq_order_BS))
{
for (j in 1:length(seq_order_UE))
{
if(first==0)
{
Disc_Time<-rbind(Disc_Time,c(ue,i,D_Time))
}
}
}
}
}
stopcluster(cl)
答
要查看您的if语句的工作,我们需要知道first
是如何设置的,和什么样的价值有你的循环之前。无论如何,它看起来并不像first
更改,所以它确实应该放在您的%dopar%
声明之外。
这就是说,if语句不是你的问题。 foreach
返回表达式中每个返回的列表。例如:
ls <- foreach(d = 1:5) %dopar% {
return(i)
}
给出了一个包含数字1到5的列表ls
。
函数中唯一的表达式是对Disc_Time
的转让调用。这将在每个节点中进行评估,并且永远不会返回到父级环境。 Disc_Time
永远不会改变代码被调用的地方)。
它看起来好像你正试图设置你的并行功能的副作用(改变Disc_Time
),据我所知在并行上下文中是不可能的。也许你想:那么
MDP_x<-foreach (d = 1:length(dista),.combine='c')%dopar%
{
for (q in 1:sim)
{
for (ue in 1:n)
{
for (i in 1:length(seq_order_BS))
{
for (j in 1:length(seq_order_UE))
{
if(first==0)
{
return(rbind(Disc_Time,c(ue,i,D_Time)))
} else {
return(NA)
}
}
}
}
}
stopcluster(cl)
MDP_x
应该有你想要的每一个d
'first'在你展示的代码未初始化的值。它是在你的完整代码中初始化的吗? – G5W
是的,是的。代码完美。 –