2016-04-29 134 views
-1

我有一个函数,它将函数列表作为参数。从对象列表中获取其名称的字符向量

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

我不确定我是否理解你的问题的一般版本,但如果这个问题出现了很多,可能有更好的方法来完成这些任务。 – MrFlick

+0

感谢您的有用评论。 – andrewH

回答

5

一旦运行

tests <- list(mean, varience, skewness, kurtosis) 

这些符号进行评估并丢弃。如果你看一下

tests[[2]] 

什么的,你可以看到是不是真的有一个原始参考varience,而是现在被存储在一个列表,符号varience指出的funcion。 (由于承诺和调用堆栈,将参数传递给函数时情况有点不同,但这不是你在这里做的)。运行后没有懒惰评估list()

如果要保留函数的名称,最好使用命名列表。你可以像

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

一个辅助函数现在值保存为名称

names(tests) 
# [1] "mean"  "var"  "skewness" "kurtosis" 
+0

谢谢!对于我所要做的,这是一个非常有效的解决方法,即使用函数的名称命名应用于对象的函数列表的输出,而不必键入所有内容两次。 – andrewH

+0

嘿,即使当nlist()被定义为_inside function_时,它也可以工作。优秀! – andrewH

1

我承认是有点被这个问题,这让我觉得莫名其妙有信息,您避风港的一些作品与我们分享。

例如,你说:

我想GetNames命名对象

庵任何名单的工作...好了对象的命名为列表,如一个功能已经存在,它被称为names()

的“理智”的方式做这样的事情仅仅是名字摆在首位名单:

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

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

+1

我没有说出一个命名列表,我说了一个命名对象的列表。我的例子中的对象是函数。这些函数具有名称。名称(测试)返回NULL。 lapply(测试,名称)返回一个包含五个NULL的列表。不希望在经常使用的函数中输入两次所有内容都很神秘吗? – andrewH