有没有办法在两个向量上使用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`
这似乎是一个相当人为的解决方案,但我无法弄清楚如何做到这一点。我遇到的问题是:
即使dummyList
永远不会更改,也需要创建dummyList
,并且在调用mapply
后为空列表。
如果数字向量c(1, 2)
未转换为列表,则调用mapply
的结果是双精度的命名向量。
要解决问题2,我总是可以在两个向量上调用mapply
,然后在结果上调用as.list
,但似乎应该有一种方法可以直接创建一个列表值在向量中。
答案 0 :(得分:69)
您可以使用setNames()
setNames(as.list(c(1, 2)), c("foo", "bar"))
(列表)或
setNames(c(1, 2), c("foo", "bar"))
(对于矢量)
答案 1 :(得分:8)
我与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
注意USE.NAMES
的文档说:
USE.NAMES逻辑;如果第一个...参数有名称,则使用名称,或 如果是字符向量,请使用该字符向量作为名称。
答案 2 :(得分:0)
我提出的建议分两个步骤进行,非常简单,因此也许更容易理解:
test_list <- list(1, 2)
names(test_list) <- c("foo", "bar")
@ ben-bolker提出的建议行之有效,但只是想分享一个替代方案,以防您喜欢。
编码愉快!