2016-04-29 106 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

相關問題