如何将3级lapply循环的结果传递给全局环境

时间:2014-07-24 03:02:45

标签: r scope environment lapply

问题是res对象(模型的结果,foo()返回的是nos被分配给cv对象。我猜有一个环境问题没有通过对象。有什么想法吗?

seed_inx <- 1:10
ntree <- seq(1000, 51000, 2500)
maxnodes <- c(seq(50, 900, 50), seq(1000, 10000, 500))

cv <- lapply(seed_inx, function(x1) {
        lapply(ntree, function(x2) {
          lapply(maxnodes, function(x3) {
            print(sprintf("Seed: %s, ntree: %s, max_nd: %s", x1, x2, x3))
            res <- paste(x1, x2, x3)
          })
          return(res)
        })
        return(res)
      })

1 个答案:

答案 0 :(得分:1)

您的代码提供了

# Error in FUN(c(1000, 3500, 6000, 8500, 11000, 13500, 16000, 18500, 21000,  : 
#   object 'res' not found

正确,因为res是最内部lapply的本地,所以它在该匿名函数的末尾被销毁。但是在R中,函数返回最后一个计算表达式的值,因此您需要做的就是删除赋值和显式return()调用。即:

cv <- lapply(seed_inx, function(x1) {
        lapply(ntree, function(x2) {
          lapply(maxnodes, function(x3) {
            print(sprintf("Seed: %s, ntree: %s, max_nd: %s", x1, x2, x3))
            paste("foobar", x1, x2, x3)
          })
        })
      })

运行良好:

# [1] "Seed: 1, ntree: 1000, max_nd: 50"
# [1] "Seed: 1, ntree: 1000, max_nd: 100"
# [1] "Seed: 1, ntree: 1000, max_nd: 150"
# [...]

cv[[10]][[5]][[5]]
# [1] "foobar 10 11000 250"