Попробуйте, 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
warning and stop Они оба выдают имя функции вместе с передаваемым им аргументом, поэтому нет необходимости получать текущее имя функции.
testWarning <- function() warning("X")
testWarning()
## Warning message:
## In testWarning() : X