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 deparse
verrà 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