从对象列表中获取对象名称的特征向量

From a list of objects, get a character vector of their 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获取对象列表,在本例中为函数,return将对象名称作为文本。理想情况下,我希望 GetNames 使用任何命名对象列表:

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

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

我试过了:

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

但是这个 returns:

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

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

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

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

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

一旦你 运行

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"

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

比如你说:

I'd like GetNames to work with any list of named objects

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

做这种事情的 "sane" 方法就是首先命名列表:

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

或者您可以通过 setNames.

以编程方式设置名称