在R中生成命名列表

时间:2015-04-16 19:53:06

标签: r

如果我想创建一个名为list的命名列表,我可以这样做:

list(foo=1,bar=2,baz=3)

如果我想用任意计算制作一个列表,我可以使用lapply,例如:

lapply(list(1,2,3), function(x) x)

但是,lapply生成的列表将始终是常规编号列表。有没有办法可以使用名称为lapply的函数生成列表。

我的想法是:

lapply(list("foo","bar","baz), function(key) {key=5}

==>

list(foo=5,bar=5,baz=5)

这样我就不必将键和值作为文字。

我知道我可以这样做:

res = list()
for(key in list("foo","bar","baz") {
    res[key] <- 5;
}

但我不喜欢我必须创建一个空列表并将其变异以填充它。

编辑:我还想根据密钥进行一些计算。像这样:

lapply(c("foo","bar","baz"), function(key) {paste("hello",key)=5})

2 个答案:

答案 0 :(得分:5)

sapply如果是字符向量,则会将其参数用于名称,因此您可以尝试:

sapply(c("foo","bar","baz"), function(key) 5, simplify=F)

产生:

$foo
[1] 5

$bar
[1] 5

$baz
[1] 5

答案 1 :(得分:2)

如果您的列表首先有名称,lapply将保留它们

lapply(list(a=1,b=2,c=3), function(x) x)

或者您可以使用setNames()

之前或之后设置名称
#before
lapply(setNames(list(1,2,3),c("foo","bar","baz")), function(x) x)

#after
setNames(lapply(list(1,2,3), function(x) x), c("foo","bar","baz"))

另一个&#34;选项&#34;是Map()Map将尝试从您传入的第一个参数中获取名称。您可以忽略函数中的值,并仅将其用于保留名称的副作用

Map(function(a,b) 5, c("foo","bar","baz"), list(1:3))

但是在lapply / Map步骤中无法更改名称。它们只能从其他位置复制。如果你需要改变名称,你必须将其作为一个单独的步骤。