R从对象列表中获取对象的名称

时间:2013-09-17 23:56:51

标签: r

我尝试从包含此对象的列表中获取对象的名称。我搜索了类似的问题,并找到了一些关于使用deparse(substitute(object))公式的建议:

> my.list <- list(model.product, model.i, model.add)
> lapply(my.list, function(model) deparse(substitute(model)))

结果是:

[[1]]
[1] "X[[1L]]"

[[2]]
[1] "X[[2L]]"

[[3]]
[1] "X[[3L]]"

而我想获得:

[1] "model.product", "model.i", "model.add"

提前感谢您的帮助!

4 个答案:

答案 0 :(得分:7)

您可以编写自己的list()函数,使其行为类似data.frame(),即使用未评估的arg名称作为条目名称:

List <- function(...) {
  names <- as.list(substitute(list(...)))[-1L]
  setNames(list(...), names)
}

my.list <- List(model.product, model.i, model.add)

然后你可以通过以下方式访问这些名字:

names(my.list)

答案 1 :(得分:2)

names(my.list) #..............
哦,等等,你真的没有创造名字吗?列表功能实际上没有“内存”。它返回一个列表,其中包含参数的值,但不会从它们的来源返回,除非您将名称添加到作为参数给出的pairlist中。

答案 2 :(得分:1)

创建my.list后,您将无法以这种方式提取信息。

R的基本方式是表达式在需要之前不会被评估;使用deparse(substitute())只能在计算表达式之前使用。所以:

deparse(substitute(list(model.product, model.i, model.add)))

应该有效,而你的则没有。

答案 3 :(得分:1)

为了节省填充,您可以使用mget将自由浮动变量收集到包含以下名称的列表中:

one <- two <- three <- 1
result <- mget(c("one","two","three"))
result
#$one
#[1] 1
# 
#$two
#[1] 1
# 
#$three
#[1] 1

然后你可以关注@Ddin的建议:

names(result)
#[1] "one"   "two"   "three"