foreach:保持名字

时间:2014-12-03 16:03:51

标签: r foreach

有没有办法让foreach()返回一个命名列表/ data.frame。 E.g。

foo <- list(a = 1, b = 2)
bar <- foreach (x = foo) %do% { x * 2 }

返回list(2, 4)。我希望它返回list(a = 2, b = 4)

另外,有没有办法从循环体内访问名称?

(我对在foreach循环之后分配名称的解决方案不感兴趣。)

此致

2 个答案:

答案 0 :(得分:3)

感谢您的推荐。这就是我想出的:

foo <- list(a = 1, b = 2)
bar <- foreach (x = foo, n = names(foo), .combine = c) %do% {
    rv <- list()
    rv[[n]] <- x * 2
    rv
}

答案 1 :(得分:0)

我曾经使用过foreach,但是切换到purrr时我没有回头。

purrr提供了一系列映射功能,这些功能使处理命名列表(以及列表和data.frames ...)变得轻而易举。所有映射操作都会保留名称。

library("purrr")

foo <- list(a = 1, b = 2)
bar <- map(foo, ~ .x * 2)

# $a
# [1] 2
# $b
# [1] 4

简洁明了,您无法击败它。

  

加上,有没有办法从循环体内访问名称?

肯定是:?imap

bar <- imap(foo, function(elem, name) {
    print(paste("Processing", name))
    elem * 2
})

或匿名样式:

bar <- imap(foo, ~ {print(paste("Processing", .y)) ; .x * 2})