Spróbuj, sys.call(0)
jeśli wynik obiektu wywołania jest poprawny lub usuń go, jeśli chcesz, aby nazwa była ciągiem znaków. Poniżej znajduje się kilka testów tego. sys.call zwraca zarówno nazwę, jak i argumenty, a [[1]] wybiera tylko nazwę.
my_fun <- function() deparse(sys.call(0)[[1]])
g <- function() my_fun()
my_fun()
## [1] "my_fun"
g()
## [1] "my_fun"
Nazwy funkcji
Pamiętaj, że funkcje w rzeczywistości nie mają nazw. To, co uważamy za nazwy funkcji, jest w rzeczywistości tylko zmiennymi, które przechowują funkcję i nie są częścią samej funkcji. Funkcja składa się z argumentów, treści i środowiska - wśród tych składników nie ma nazwy funkcji.
Funkcje anonimowe
Ponadto można mieć anonimowe funkcje, które mogą zwracać dziwne wyniki, jeśli zostaną użyte powyżej.
sapply(1:3, function(x) deparse(sys.call(0)[[1]]))
## [1] "FUN" "FUN" "FUN"
Skrzynie na brzeg
Istnieją pewne sytuacje, w szczególności związane z funkcjami anonimowymi, w których deparse
zwróci więcej niż jeden element, więc jeśli chcesz uwzględnić takie przypadki krawędzi, użyj argumentu nlines = 1, aby przeprowadzić deparse lub użyć deparse (...) [[1]] lub jako wspomniane przez @Konrad Rudolph przy użyciu deparse1 w 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]])"
Inny
Przypomnijmy . Jeśli chcesz, aby nazwa funkcji wywoływała funkcję rekurencyjnie, użyj Recall()
zamiast tego. Z pliku pomocy:
fib <- function(n)
if(n<=2) { if(n>=0) 1 else 0 } else Recall(n-1) + Recall(n-2)
fib(4)
## [1] 3
ostrzeżenie i zatrzymanie Oba wydają nazwę funkcji wraz z przekazanym im argumentem, więc nie ma potrzeby uzyskiwania bieżącej nazwy funkcji.
testWarning <- function() warning("X")
testWarning()
## Warning message:
## In testWarning() : X