Prova sys.call(0)se l'output di un oggetto call è ok o deparse se vuoi solo il nome come stringa di caratteri. Di seguito sono riportati un paio di test di questo. sys.call restituisce sia il nome che gli argomenti e [[1]] seleziona solo il nome.
my_fun <- function() deparse(sys.call(0)[[1]])
g <- function() my_fun()
my_fun()
## [1] "my_fun"
g()
## [1] "my_fun"
Nomi delle funzioni
Si noti che le funzioni in realtà non hanno nomi. Ciò che consideriamo nomi di funzioni sono in realtà solo variabili che contengono la funzione e non fanno parte della funzione stessa. Una funzione è composta da argomenti, corpo e un ambiente - non esiste un nome di funzione tra quei componenti.
Funzioni anonime
Inoltre si possono avere funzioni anonime e queste potrebbero restituire strani risultati se usate con quanto sopra.
sapply(1:3, function(x) deparse(sys.call(0)[[1]]))
## [1] "FUN" "FUN" "FUN"
Custodie per bordi
Esistono alcune situazioni, in particolare che coinvolgono funzioni anonime, in cui deparseverrà restituito più di un elemento, quindi se vuoi coprire tali casi limite usa l'argomento nlines = 1 per deparse o usa deparse (...) [[1]] o come menzionato da @Konrad Rudolph usando deparse1 in 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]])"
Altro
Recall . Se il motivo per cui si desidera il nome della funzione è chiamare ricorsivamente la funzione, utilizzare Recall()invece. Dal file di aiuto:
fib <- function(n)
if(n<=2) { if(n>=0) 1 else 0 } else Recall(n-1) + Recall(n-2)
fib(4)
## [1] 3
avviso e arresto Entrambi forniscono il nome della funzione insieme a qualunque argomento gli venga passato, quindi non è necessario ottenere il nome della funzione corrente.
testWarning <- function() warning("X")
testWarning()
## Warning message:
## In testWarning() : X