如果我想创建一个名为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})
答案 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步骤中无法更改名称。它们只能从其他位置复制。如果你需要改变名称,你必须将其作为一个单独的步骤。