Предположим, что я написал функцию, принять другую функцию в качестве аргумента:Проверьте имя функции передается в качестве аргумента в функции 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"
Однако, это хорошая практика?
Спасибо! Оно работает! Я хотел бы знать, как это работает. Я проверил и 'type'' match.call() $ FUN' в примере - 'symbol', а' class' - 'name'. Я подумал (неправильно), что это не сработает, потому что 'match.call() $ FUN' не является строкой. Является ли 'called' принужденным к строке в сравнении' called == "rnorm" '? – sfcheung
@sfcheung Да, это в значительной степени. Имена/символы - это довольно много строк, которые представляют объекты. У справочной страницы '? Name' есть некоторые пояснения. – Molx