有没有办法让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循环之后分配名称的解决方案不感兴趣。)
此致
答案 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})