从对象列表中,获取其名称的字符向量

时间:2016-04-29 20:25:00

标签: r scope substitution evaluation names

我有一个函数,它将函数列表作为参数。

library(moments)
library(plyr)
tests <- list(mean, varience, skewness, kurtosis)
f <- function(X, tests){
  out   <- each(... = tests)(X)   #each from plyr
  names(out) <- GetNames(tests)
  out
}

我希望GetNames获取对象列表,在本例中为函数,并将对象的名称作为文本返回。理想情况下,我希望GetNames能够使用任何命名对象列表:

> GetNames(tests)
[1] "mean"     "varience" "skewness" "kurtosis"

as.character(tests)返回每个函数的代码文本,而不是它们的名称。

我试过了:

GN <- function(X) deparse(substitute(X))
GetNames <- function(X) lapply(tests, GN)
GetNames(tests)

但是这会回来:

[[1]]
[1] "X[[i]]"

[[2]]
[1] "X[[i]]"

[[3]]
[1] "X[[i]]"

[[4]]
[1] "X[[i]]"

编写R代码时,我经常遇到此问题的某些版本。我想要一个函数来评估它的参数一些步骤,这里从tests到其对象的名称一步,然后停止并让我对结果做一些事情,这里将它们转换为字符串,而不是去在获取它们之前获取名称的指示物(名称)。

2 个答案:

答案 0 :(得分:5)

运行后

tests <- list(mean, varience, skewness, kurtosis)

评估并丢弃这些符号。如果你看看

tests[[2]]

或其他什么,你可以看到它确实没有varience的原始引用,而是符号varience所指向的功能现在存储在列表中。 (由于承诺和调用堆栈,将参数传递给函数时,事情会有所不同,但这不是你在这里做的事情)。在你运行它之后,list()没有惰性评估。

如果要保留函数的名称,最好使用命名列表。你可以创建一个像

这样的辅助函数
nlist <- function(...) { dots<-substitute(...()); setNames(list(...), sapply(dots, deparse))}
tests <- nlist(mean, var, skewness, kurtosis)

现在,值将保留为名称

names(tests)
# [1] "mean"     "var"      "skewness" "kurtosis"

答案 1 :(得分:1)

我承认对这个问题感到有些困惑,这让我觉得你还没有与我们分享过一些信息。

例如,你说:

  

我希望GetNames能够使用任何命名对象列表

嗯......对于名为的对象列表,这样的函数已经存在,并且它被称为names()

执行此类操作的“理智”方式只是首先列出名单:

tests <- list("mean" = mean, "variance" = variance, 
              "skewness" = skewness, "kurtosis" = kurtosis)

或者您可以通过setNames以编程方式设置名称。