2015-11-02 3 views
1

Предположим, что я написал функцию, принять другую функцию в качестве аргумента:Проверьте имя функции передается в качестве аргумента в функции R

fct1 <- function(FUN) { 
    # If FUN is rnorm, then do this. 
    # If FUN is rbeta, then do this. 
    } 

Как следует проверить, является ли FUN это rnorm?

Я знаю, что могу это сделать, чтобы преобразовать функцию в список по as.list(), а затем принуждать его в строку с помощью toString():

toString(as.list(rnorm)) 

Результат:

", 0, 1, .Call(C_rnorm, n, mean, sd)" 

Я могу тогда проверьте содержимое для C_rnorm.

Но я думаю, что это нехорошее решение. Я также где-то читал (я не могу вспомнить источник), что принуждение закрытия к списку, а затем строка возможна только для обратной совместимости и не рекомендуется.

Я также думал о body(). Например,

body(rnorm) 

Результат:

.Call(C_rnorm, n, mean, sd) 

Однако, то, как я могу проверить, если C_rnorm находится внутри вызова? Я пытался использовать as.list(), а затем toString():

toString(as.list(body(rnorm))) 

Это результат:

".Call, C_rnorm, n, mean, sd" 

Однако, это хорошая практика?

ответ

2

Вы можете использовать match.call:

fct1 <- function(FUN) { 
    called <- match.call()$FUN 
    if(called == "rnorm") { 
    return("Passed rnorm") 
    } else { 
    return("Not rnorm") 
    } 

} 

fct1(rnorm) 
# [1] "Passed rnorm" 
fct1(rlnorm) 
# [1] "Not rnorm" 
+0

Спасибо! Оно работает! Я хотел бы знать, как это работает. Я проверил и 'type'' match.call() $ FUN' в примере - 'symbol', а' class' - 'name'. Я подумал (неправильно), что это не сработает, потому что 'match.call() $ FUN' не является строкой. Является ли 'called' принужденным к строке в сравнении' called == "rnorm" '? – sfcheung

+0

@sfcheung Да, это в значительной степени. Имена/символы - это довольно много строк, которые представляют объекты. У справочной страницы '? Name' есть некоторые пояснения. – Molx

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