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

R 从对象列表中,获取其名称的字符向量,r,scope,substitution,evaluation,names,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 } as.charactertests返回每个函数

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

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
}
as.charactertests返回每个函数的代码文本,而不是它们的名称

我试过:

GN <- function(X) deparse(substitute(X))
GetNames <- function(X) lapply(tests, GN)
GetNames(tests)
我在编写R代码时经常遇到这个问题。我想要一个函数计算它的参数一些步骤,这里是从测试到它的对象名的一个步骤,然后停止并让我对结果做一些事情,在这里将它们转换为字符串,而不是在我可以获取名称之前获取名称的引用。

一旦运行

tests <- list(mean, varience, skewness, kurtosis)
或者,您可以看到实际上并没有对varience的原始引用,而是符号varience指向的函数现在存储在列表中。由于承诺和调用堆栈,在向函数传递参数时,情况会有所不同,但这不是您在这里要做的。运行列表后,不会对其进行延迟计算

如果希望保留函数的名称,最好使用命名列表。您可以创建一个助手函数,如

nlist <- function(...) { dots<-substitute(...()); setNames(list(...), sapply(dots, deparse))}
tests <- nlist(mean, var, skewness, kurtosis)

我承认我对这个问题有点困惑,这让我觉得有些信息你没有和我们分享

例如,你说:

我想让GetNames处理任何命名对象列表

嗯……对于一个命名的对象列表,这样的函数已经存在,它被称为names

做这类事情的明智方法是首先列出清单:

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

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

我不确定是否理解您对该问题的一般看法,但如果经常出现这种情况,可能会有更好的方法来完成这些任务。感谢您的帮助。我没有;我说的不是命名列表,而是命名对象的列表。我的示例中的对象是函数。函数有名称。namestests返回NULL。lapplytests,names返回五个空值的列表。不想在一个常用函数中键入所有内容两次是不是很神秘?谢谢!这是一个非常有效的解决方法,我正在尝试做的是命名应用于对象的函数列表的输出和函数的名称,而不必键入所有内容两次。嘿,即使在函数内部定义了nlist,这也有效。杰出的
tests[[2]]
nlist <- function(...) { dots<-substitute(...()); setNames(list(...), sapply(dots, deparse))}
tests <- nlist(mean, var, skewness, kurtosis)
names(tests)
# [1] "mean"     "var"      "skewness" "kurtosis"
tests <- list("mean" = mean, "variance" = variance, 
              "skewness" = skewness, "kurtosis" = kurtosis)