2016-08-08 4 views
0

я сохраненная функцию под названием «тип» в списке «funList» как такПолучение имени функции после того, как он получил под названием

funList <- list(type = function() { 
    funname <- ??? 
    print(funname) # should return "type" } 
) 

В других частях моего кода я называю эту функцию, но никогда по его имя, но вместо того, чтобы его позиция в списке, например:

funList[[1]]() 

в действительности функция «тип», конечно, гораздо сложнее, но есть часть в теле функции, которая использует собственное имя функции. Как я могу получить имя, когда я его называю только положением? Другими словами, как я могу использовать последний вызов функции «type».

+3

Вы не создать именованный функцию. Вы создали именованный список. Ваша анонимная функция не имеет возможности узнать о имени, которое вы указали в названном списке. Вам нужно будет создать функцию-обертку, которая одновременно создаст список и функцию, и может создать правильную область для хранения значения. Конечно, это сломается, если вы переименуете список вообще. Что вы на самом деле пытаетесь сделать? Может быть, есть лучший способ. – MrFlick

+0

Я понимаю, спасибо. Очень широко говоря, этот код будет частью специфического DSL, который я пишу, чтобы применять функции к конкретным столбцам в фрейме данных. Мне нужно реализовать его так, чтобы сначала эти функции собирались и сохранялись в контейнере (funList), а затем последовательно применялись к столбцам в фрейме данных. Возможно, имя столбца, т. Е. Тип, также может отображаться как аргумент функции, но я думал, что было бы лучше написать его, как я. В любом случае, я действительно был бы признателен за некоторые подсказки о том, как я мог придумать решения для обертки, которые вы упомянули. –

+0

То, что вы пытаетесь сделать, выполняется в R, используя нестандартную оценку. Это сложный и тонкий предмет. Для хорошего ознакомления см. Http://adv-r.had.co.nz/Computing-on-the-language.html#nse – Paul

ответ

0

Немного хакерского решения, но идея здесь состоит в том, чтобы извлечь номер из match.call() и найти соответствующее имя функции от names(funList).

funList <- list(
    type = function() { 
    # Do something 
    getFunName(match.call()) 
    }, 
    bob = function() { 
    # Do something else 
    getFunName(match.call()) 
    } 
) 

getFunName <- function(call) { 
    names(funList)[as.numeric(gsub(".*?([0-9]+)(.*)", "\\1", as.character(call)[1]))] 
} 

Выход:

> funList[[1]]() 
[1] "type" 
> funList[[2]]() 
[1] "bob" 
+0

Если бы это было так, что бы это произошло с такими вещами, как 'funList [[1]] (2)' или 'lapply (funList, function (f) f())' – MrFlick

+0

Спасибо - отредактирован для решения первой проблемы, не уверен, что делать со вторым. Было бы интересно узнать, что другие придумали! –