从对象列表中获取对象名称的特征向量
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
.
以编程方式设置名称
我有一个将函数列表作为参数的函数。
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
.