55

有没有办法在两个向量上使用 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`

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

  1. dummyList即使从未更改,它也需要创建,dummyList并且在调用后是一个空列表mapply

  2. 如果数值向量 ,c(1, 2)未转换为列表,则调用的结果mapply是双精度数的命名向量。

为了解决问题 2,我总是可以调用mapply两个向量,然后调用as.list结果,但似乎应该有一种方法可以直接创建一个列表,其中的值位于向量中。

4

3 回答 3

104

您可以使用setNames()

setNames(as.list(c(1, 2)), c("foo", "bar"))

(用于列表)或

setNames(c(1, 2), c("foo", "bar"))

(对于矢量)

于 2013-07-24T19:08:01.973 回答
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

注意到文档USE.NAMES说:

USE.NAMES 逻辑;如果第一个 ... 参数有名称,则使用名称,或者如果它是字符向量,则使用该字符向量作为名称。

于 2013-07-24T19:13:30.173 回答
9

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

test_list <- list(1, 2)
names(test_list) <- c("foo", "bar")

@ben-bolker 提出的建议可行,但只是想分享一个替代方案,以防您喜欢它。

快乐编码!

于 2019-12-16T15:13:56.370 回答