从两个向量(名称,值)创建命名列表

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)

这似乎是一个相当人为的解决方案,但我无法弄清楚如何做到这一点.我遇到的问题是:

  1. 它需要创建dummyList即使dummyList永远不会改变,并且在调用之后是一个空列表mapply.

  2. 如果数字向量,,, 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)

(对于矢量)


jor*_*ran 9

我和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合乎逻辑; 如果第一个...参数具有名称,或者如果它是字符向量,则使用该字符向量作为名称.


Una*_*hez 9

我的建议是分两步完成的,而且很简单,所以也许更容易理解:

test_list <- list(1, 2)
names(test_list) <- c("foo", "bar")
Run Code Online (Sandbox Code Playgroud)

@ben-bolker 提出的建议有效,但只是想分享一个替代方案,以防万一。

快乐编码!