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)