能否在建立list对象时,保留原来元素的名字
a <- 4
b <- 5
期望通过一个函数f,f(a, b)
能得到list(a = a, b = b)
的结果
如果单纯通过list,原来的命名会丢失。
list(a, b)
# [[1]]
# [1] 4
#
# [[2]]
# [1] 5
我本来的问题是希望能在函数里面获得可变参数(不知道是不是这样翻译的),也就是...的对象的名字,没有成功。所以想通过用把所有需要的参数整合成一个list,通过list的名字获取本来的对象名字。
我写了一个函数,算是解决了自己的问题,如下:
list_name <- function(...){
# enexprs catches the input, and turned into character by as.character
names_dot <- sapply(rlang::enexprs(...), as.character)
setNames(..., names_dot)
}
a <- 1
b <- 2
list_name(a, b)
# $a
# [1] 1
#
# $b
# [1] 2
经过我抛砖引玉,谢老师提醒,可用match.call()
捕捉函数输入的表达式。如果能不引入依赖的话,最好不要引入。
list_name = function(...) {
nms = sapply(as.list(match.call())[-1], as.character)
setNames(list(...), nms)
}