使用lapply无法将变量名和其值拼接成列表?

3
我尝试使用下面的代码,但是失败了。我想知道为什么它失败了,以及正确(和优雅)的做法是什么?
a <- 1
b <- 2
res <- lapply(ls(), function(x, l) { l$x <- get(x)}, l=list())

我希望您能提供以下结果:
res
# $a
# [1] 1

# $b
# [1] 2

但我得到的是什么?
res
# [[1]]
# [1] 1

# [[2]]
# [1] 2
2个回答

3
我们可以使用mget来获取多个对象的值,并返回一个命名列表
mget(ls())
#$a
#[1] 1

#$b
#[1] 2

如果我们需要使用 get,那么可以使用 ls() 设置名称。

setNames(lapply(ls(), get), ls())

哇,太棒了!但是为什么我的代码失败并给出这个奇怪的结果?我不知道为什么[[1]]和[[2]]存在。 - VicaYang
@VicaYang 你的代码只有在检查 lapply(ls(), function(x) get(x)) 后才返回对象值。 - akrun
1
是的..我认为它会返回我的函数的返回值,我将去查看文档以获取详细信息,非常感谢! - VicaYang

1
使用 sapply
sapply(ls(), get, simplify = FALSE)
# $a
# [1] 1
# 
# $b
# [1] 2

sapply函数有simplifyUSE.NAMES参数,它们的默认值均为TRUE。因此,将simplify设置为FALSE,我们可以保持结果为命名列表。


1
@akrun 正确的,已修复,谢谢。我有个坏习惯。 - zx8754

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接