Спробуйте, sys.call(0)
якщо вихід об'єкта виклику буде нормальним чи розходячим, якщо ви просто хочете, щоб ім'я було як символьний рядок. Нижче наведено пару тестів цього. sys.call повертає і ім’я, і аргументи, і [[1]] вибирає саме ім’я.
my_fun <- function() deparse(sys.call(0)[[1]])
g <- function() my_fun()
my_fun()
## [1] "my_fun"
g()
## [1] "my_fun"
Назви функцій
Зауважте, що функції насправді не мають імен. Те, що ми розглядаємо як імена функцій, насправді є лише змінними, які утримують функцію і не є частиною самої функції. Функція складається з аргументів, тіла та середовища - серед цих складових немає назви функції.
Анонімні функції
Крім того, можна мати анонімні функції, і це може повернути дивні результати при використанні вищезазначеного.
sapply(1:3, function(x) deparse(sys.call(0)[[1]]))
## [1] "FUN" "FUN" "FUN"
Корпусні кромки
Існують деякі ситуації, зокрема із залученням анонімних функцій, де deparse
повертається більше одного елемента, тому, якщо ви хочете охопити такі крайові випадки, використовуйте аргумент nlines = 1 для відміни або використання deparse (...) [[1]] або як згаданий @Konrad Rudolph, використовуючи deparse1 в R 4.0.0.
Map(function(x) deparse(sys.call(0)[[1]], nlines = 1), 1:2)
## [[1]]
## [1] "function (x) "
##
## [[2]]
## [1] "function (x) "
Map(function(x) deparse(sys.call(0)[[1]]), 1:2) # without nlines=1
## [[1]]
## [1] "function (x) " "deparse(sys.call(0)[[1]])"
##
## [[2]]
## [1] "function (x) " "deparse(sys.call(0)[[1]])"
Інший
Нагадаємо . Якщо ви хочете, щоб ім'я функції було рекурсивно викликати функцію, тоді використовуйте Recall()
замість цього. З довідкового файлу:
fib <- function(n)
if(n<=2) { if(n>=0) 1 else 0 } else Recall(n-1) + Recall(n-2)
fib(4)
## [1] 3
попередження та зупинка. Вони обидва видають ім'я функції разом з будь-яким аргументом, який передається їм, тому не потрібно отримувати поточну назву функції.
testWarning <- function() warning("X")
testWarning()
## Warning message:
## In testWarning() : X