用于lappy的函数返回parlappy的错误

用于lappy的函数返回parlappy的错误,r,lapply,doparallel,R,Lapply,Doparallel,我有一个函数,我正在与lapply一起使用,它工作得很好。我已经尝试将lappy转换为parlappy,现在它在集群节点1处理元素1上返回一个错误:“closure”类型的对象不可子集。这是我如何设置并行环境的问题,还是其他问题 我正在使用的函数: setLimits<-function(col){ if(choice=="num"){ if (auto=="0"){ high=inHigh[count] low=in

我有一个函数,我正在与lapply一起使用,它工作得很好。我已经尝试将lappy转换为parlappy,现在它在集群节点1处理元素1上返回一个
错误:“closure”类型的对象不可子集。这是我如何设置并行环境的问题,还是其他问题

我正在使用的函数:

setLimits<-function(col){
    if(choice=="num"){
        if (auto=="0"){
            high=inHigh[count]
            low=inLow[count]
        }
        else{
            high=inHigh[1]
            low=inLow[1]    
        }
    }
    else{
        if (auto=="0"){
            high=attributes(dt[,col])$SpotfireColumnMetaData$limits.prod.upper+attributes(dt[,col])$SpotfireColumnMetaData$limits.prod.upper*(inHigh[count]/100)
            low=attributes(dt[,col])$SpotfireColumnMetaData$limits.prod.lower+attributes(dt[,col])$SpotfireColumnMetaData$limits.prod.lower*(inLow[count]/100)
        }
        else{
            high=attributes(dt[,col])$SpotfireColumnMetaData$limits.prod.upper+attributes(dt[,col])$SpotfireColumnMetaData$limits.prod.upper*(inHigh[1]/100)
            low=attributes(dt[,col])$SpotfireColumnMetaData$limits.prod.lower+attributes(dt[,col])$SpotfireColumnMetaData$limits.prod.lower*(inLow[1]/100)
        }
    }
    list(low,high)
}
调用lappy:

inVal=lapply(1:ncol(dt),setLimits)

很抱歉,我将无法提供dt,并且
dput
似乎不适用于我正在使用的程序。dt存储为data.frame。我确实稍微简化了函数,但我试图保留其中发生的主要内容。

您是否使用
clusterExport
dt
复制到集群节点?我认为集群将
dt
视为函数
stats::dt
。您还应该导出函数中的
choice
count
以及任何其他必需但未作为函数参数提供的对象。@BenBarnes如果这些对象保存为全局变量,我还需要导出它们吗?而且dt相当大,所以导出它会使它慢很多吗?如果你使用WIndows,那么是的,你必须导出全局变量。如果您使用的是Linux/Mac,那么您可以使用fork。看一个好的概览是的,你需要。从上面我看到的,也许你可以先创建一个列属性列表。也许你甚至不需要循环through@BenBarnes出于某种原因,我发现没有找到dt对象。我认为这和我使用r的程序有关。有没有办法让两个输入同时速率,或者在另一个参数中使用X输入值?就像我的例子中的parlappy(cl=cluster,X=1:ncol(dt),fun=setLimits,arg2=dt[,X])
inVal=parLapply(cl=cluster,X=1:ncol(dt),fun=setLimits)
inVal=lapply(1:ncol(dt),setLimits)