R中的lm(formula)在parLapply中表现不同

时间:2019-03-27 21:00:26

标签: r parallel-processing apply lm

首先,我创建一对示例数据帧:

[0,1,2,4,5,-27]

如果我将公式创建为文本字符串,则可以将其直接插入lm()

df = data.frame("sample1" = runif(10), "sample2" = runif(10), "sample3" = runif(10), "sample4" = runif(10))
traits = data.frame("var1" = c(rep("group1", 2), rep("group2", 2)))
rownames(traits) = colnames(df)

但是,如果我尝试对parLapply执行相同的操作,则会收到一条错误消息,指示“特征”参数无法按预期工作:

> row = t(df[1,])
> ModString = "row ~ traits$var1"
> Mod = lm(as.formula(ModString))
> Mod

Call:
lm(formula = as.formula(ModString))

Coefficients:
      (Intercept)  traits$var1group2  
           0.7799             0.1788  

但是奇怪的是,我正在使用“ traits”参数使其成为parLapply,这似乎与lm()的工作方式有关。我可以输入并返回“特征”就可以了:

> num_cores <- detectCores() - 1
> cl <- makeCluster(num_cores)
> results <- parLapply(cl = cl, seq(1:10), function(i, df, traits){
+     row = df[i,]
+     ModString = "vector ~ traits$factor1"
+     Mod = lm(ModString)
+     return(Mod)
+ }, df = df, traits = traits)
Error in checkForRemoteErrors(val) : 
  9 nodes produced errors; first error: object 'traits' not found

我在这里错过了什么令人尴尬的琐碎细节?

2 个答案:

答案 0 :(得分:1)

我会这样做的;请注意完全不同的数据组织:

class test
{
public:
    static const float f;
};

答案 1 :(得分:-1)

好的,我真的很傻,但是我将不去讨论这个问题,因为这是一个很好的例子,说明在复制粘贴和编辑多个版本的代码时很容易感到困惑。我没有在as.formula中始终使用parLapply,也忘记了将变量名向量更改为row并进行转置。

所以。以下作品只是花花公子:

require(parallel)
num_cores <- detectCores() - 1
cl <- makeCluster(num_cores)
results <- parLapply(cl = cl, seq(1:10), function(i, df, traits){
    row = t(df[i,])
    ModString = "row ~ traits[,\"var1\"]"
    Mod = lm(as.formula(ModString))
    return(Mod)
}, df = df, traits = traits)