Как я могу получить имя функции в этой неанонимной функции? ниже я предполагаю, что есть функция или процесс для этого magical_r_function()
и каковы ожидаемые результаты.
my_fun <- function(){
magical_r_function()
}
my_fun()
## [1] "my_fun"
foo_bar <- function(){
magical_r_function()
}
foo_bar()
## [1] "foo_bar"
ballyhoo <- function(){
foo_bar()
}
ballyhoo()
## [1] "foo_bar"
tom_foolery <- foo_bar
tom_foolery()
## [1] "tom_foolery"
match.call
иsys.call
являются действительными базовыми функциями с небольшой разницей в «эффекте» и «требованиях». Так что мне было любопытно понять, что вы можете предпочесть одно другому.Попробуйте,
sys.call(0)
если вывод объекта вызова в порядке, или отмените его, если вы просто хотите, чтобы имя было символьной строкой. Ниже приведены несколько тестов этого. sys.call возвращает имя и аргументы, а [[1]] выбирает только имя.Имена функций
Обратите внимание, что функции на самом деле не имеют имен. То, что мы называем именами функций, на самом деле являются просто переменными, которые содержат функцию и не являются частью самой функции. Функция состоит из аргументов, тела и окружения - среди этих компонентов нет имени функции.
Анонимные функции
Кроме того, можно использовать анонимные функции, и они могут возвращать странные результаты при использовании с вышеуказанным.
Краевые случаи
Существуют некоторые ситуации, особенно связанные с анонимными функциями, где
deparse
будет возвращаться более одного элемента, поэтому, если вы хотите охватить такие крайние случаи, используйте аргумент nlines = 1 для разбора или использования deparse (...) [[1]] или как упоминается @Konrad Rudolph при использовании deparse1 в R 4.0.0.Другой
Напомним . Если причина, по которой вы хотите, чтобы имя функции было в рекурсивном вызове функции, используйте
Recall()
вместо нее. Из файла справки:warning and stop Они оба выдают имя функции вместе с передаваемым им аргументом, поэтому нет необходимости получать текущее имя функции.
источник
deparse1
функции. Я предполагаю, что мы должны начать использовать это вместоdeparse
по умолчанию, как только усыновление будет достаточно высоким.Recall
, что я чувствую, что ОП действительно было нужно. Тем не менее, ваш пример последовательности Фибоначчи не очень хороший: у него есть проблема с тем, что вы часто повторяете вызовы: дляfib(10)
,fib(8)
вызывается всего 2 раза (один разfib(10)
напрямую, один разfib(9)
),fib(7)
вызывается 3 раза,fib(6)
вызывается 5 раз. Видишь, куда это идет?Мы также можем использовать
источник