我有一个函数,它将函数列表作为参数。
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
到其对象的名称一步,然后停止并让我对结果做一些事情,这里将它们转换为字符串,而不是去在获取它们之前获取名称的指示物(名称)。
答案 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
以编程方式设置名称。