2016-04-29 2 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 указал теперь хранится в списке. (Вещи работают немного по-разному, передавая параметры функциям благодаря обещаниям и стеку вызовов, но это не то, что вы здесь делаете). Нет никакой ленивой оценки для 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 функции_. Отлично! – andrewH

1

признается, что немного озадачен этим вопросом, что заставляет меня думать, что есть некоторые части информации, которую вы убежище Мы поделились с нами.

Например, вы говорите:

Я хотел бы GetNames работать с любым списком именованных объектов

Гм ... ну для списка имени объектов, таких функция уже существует, и она называется names().

«нормальный» способ сделать такого рода вещи просто назвать список в первую очередь:

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

или вы можете установить имена программно через setNames.

+1

Я не сказал, именованный список, я сказал список названных объектов. Объектами в моем примере являются функции. Функции имеют имена. Имена (тесты) возвращают NULL. lapply (тесты, имена) возвращает список из пяти NULL. Разве загадочно не хотеть вводить все дважды в часто используемую функцию? – andrewH

Смежные вопросы