Jon*_*aus 38 constructor r list named lapply
有没有办法在两个向量上使用mapply来构造命名列表?第一个向量是类型character,包含用于列表的名称,而第二个包含值.
到目前为止,我唯一的解决方案是:
> dummyList = list()
> addToList <- function(name, value) {
+ dummyList[[name]] <- value
+ }
> mapply(addToList, c("foo", "bar"), as.list(c(1, 2))
$foo
`1`
$bar
`2`
Run Code Online (Sandbox Code Playgroud)
这似乎是一个相当人为的解决方案,但我无法弄清楚如何做到这一点.我遇到的问题是:
它需要创建dummyList即使dummyList永远不会改变,并且在调用之后是一个空列表mapply.
如果数字向量,,, c(1, 2)没有转换为列表,则调用的结果mapply是双精度命名向量.
为了解决问题2,我总是可以调用mapply两个向量然后调用as.list结果,但似乎应该有一种方法可以直接创建一个值在向量中的列表.
Ben*_*ker 76
您可以使用 setNames()
setNames(as.list(c(1, 2)), c("foo", "bar"))
Run Code Online (Sandbox Code Playgroud)
(列表)或
setNames(c(1, 2), c("foo", "bar"))
Run Code Online (Sandbox Code Playgroud)
(对于矢量)
我和Ben分享了为什么你可能想要这样做以及他的建议.
出于好奇心的考虑,有一种"隐藏"功能mapply可以实现:
x <- letters[1:2]
y <- 1:2
mapply(function(x,y) { y }, x, y, SIMPLIFY = FALSE,USE.NAMES = TRUE)
$a
[1] 1
$b
[1] 2
Run Code Online (Sandbox Code Playgroud)
注意到文档USE.NAMES说:
USE.NAMES合乎逻辑; 如果第一个...参数具有名称,或者如果它是字符向量,则使用该字符向量作为名称.
我的建议是分两步完成的,而且很简单,所以也许更容易理解:
test_list <- list(1, 2)
names(test_list) <- c("foo", "bar")
Run Code Online (Sandbox Code Playgroud)
@ben-bolker 提出的建议有效,但只是想分享一个替代方案,以防万一。
快乐编码!