5

我尝试从包含该对象的列表中获取对象的名称。我搜索了类似的问题并找到了一些关于使用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

4 回答 4

10

您可以编写自己的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)
于 2013-09-18T01:30:48.570 回答
3
names(my.list) #..............

哦等等,你实际上并没有创建名字是吗?列表函数实际上没有“记忆”。它返回一个包含其参数值的列表,但不返回它们的来源,除非您将名称添加到作为参数给出的对列表中。

于 2013-09-18T00:03:18.630 回答
1

一旦您创建了my.list.

基本的R工作方式是表达式在需要时才被评估。usingdeparse(substitute())仅在计算表达式之前有效。所以:

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

应该可以工作,而你的不行。

于 2013-09-18T00:03:27.403 回答
1

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

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

然后你可以按照@DWin的建议:

names(result)
#[1] "one"   "two"   "three"
于 2013-09-18T00:30:48.870 回答