R并行:在for循环中使用foreach循环只在第一次迭代中有效

R并行:在for循环中使用foreach循环只在第一次迭代中有效,r,foreach,R,Foreach,我正在编写一个函数来进行向后逐步的特征选择。我使用foreach作为内部循环,假设并行可以节省一些时间。但是,process viewer显示它在第一次迭代中只使用多个线程。如果使用%do%而不是%dopar%,则代码在一个线程上可以正常工作 thedata # my data fit.ols # model on thedata cl <- makeCluster(2) registerDoParallel(cl) for (i in 1:(nv - max(0,nk - 1))) {

我正在编写一个函数来进行向后逐步的特征选择。我使用foreach作为内部循环,假设并行可以节省一些时间。但是,process viewer显示它在第一次迭代中只使用多个线程。如果使用
%do%
而不是
%dopar%
,则代码在一个线程上可以正常工作

thedata # my data
fit.ols # model on thedata

cl <- makeCluster(2)
registerDoParallel(cl)
for (i in 1:(nv - max(0,nk - 1))) {
    fit2.ols <- fit.ols
    pname <- names(fit.ols$Design$unit)
    pname2 <- fit.ols$Design$name
    pterm <- attr(fit.ols$terms, "term.labels")

    drop1Model <- foreach (j = pname,
                           .packages = c("rms", "stats"), 
                           .export = c("thedata", "pname2", "pterm")) %dopar% {
        drop.var <- j
        remove.index <-
            which(unlist(lapply(strsplit(pname2," \\* "),
                                function(x)
                                    any(!is.na(match(j,x))))))
        remove.term <- pterm[remove.index]
        model <- update(fit.ols,
                        as.formula(paste(
                            ".~ . - ", paste(remove.term, collapse = "-"), sep = ""
                        )))
        drop1Model <- list(drop.var = drop.var, 
                           remove.index = remove.index, 
                           remove.term = remove.term, 
                           model = model)
    }
    # browser()c
    rsq <-
        sapply(drop1Model,function(x)
            x$model$stats["R2"])
    max.rsq <- max(rsq)
    drop.index <- which(rsq == max.rsq)[1]

    fit.ols <- drop1Model[[drop.index]]$model
    dropTerms[[i]] <- drop1Model[[drop.index]]$remove.term
    res[i + 1, 1] <- drop1Model[[drop.index]]$drop.var
    res[i + 1, 2:3] <- c(i, fit.ols$stats[["R2"]])
    if (fit.ols$stats[["R2"]] <= cutoff) {
        minimodel <- fit2.ols
    }
}
数据#我的数据
fit.ols#数据上的模型

cl我猜你已经知道R有很多内置的逐步选择方法吗?@BryanGoggin是的,我知道。我的主要观点是:为什么foreach在第一次for循环迭代中只使用多个线程?我猜你已经知道R内置了许多逐步选择方法?@BryanGoggin是的,我知道。我的主要观点是:为什么foreach在第一个for循环迭代中只使用多个线程?