Essayez sys.call(0)si la sortie d'un objet d'appel est correcte ou analysez-la si vous voulez juste que le nom soit une chaîne de caractères. Voici quelques tests à ce sujet. sys.call renvoie à la fois le nom et les arguments et [[1]] choisit uniquement le nom.
my_fun <- function() deparse(sys.call(0)[[1]])
g <- function() my_fun()
my_fun()
## [1] "my_fun"
g()
## [1] "my_fun"
Noms des fonctions
Notez que les fonctions n'ont pas de noms. Ce que nous considérons comme des noms de fonction ne sont en fait que des variables qui détiennent la fonction et ne font pas partie de la fonction elle-même. Une fonction se compose d'arguments, de corps et d'un environnement - il n'y a pas de nom de fonction parmi ces constituants.
Fonctions anonymes
De plus, on peut avoir des fonctions anonymes et celles-ci peuvent retourner des résultats étranges lorsqu'elles sont utilisées avec ce qui précède.
sapply(1:3, function(x) deparse(sys.call(0)[[1]]))
## [1] "FUN" "FUN" "FUN"
Cas de bord
Il existe certaines situations, en particulier impliquant des fonctions anonymes, où deparseretournera plus d'un élément, donc si vous voulez couvrir de tels cas marginaux, utilisez l'argument nlines = 1 pour analyser ou utilisez deparse (...) [[1]] ou as mentionné par @Konrad Rudolph en utilisant deparse1 dans 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]])"
Autre
Rappel . Si la raison pour laquelle vous voulez que le nom de la fonction soit d'appeler récursivement la fonction, utilisez Recall()plutôt. Depuis le fichier d'aide:
fib <- function(n)
if(n<=2) { if(n>=0) 1 else 0 } else Recall(n-1) + Recall(n-2)
fib(4)
## [1] 3
avertissement et arrêt Ces deux émettent le nom de la fonction ainsi que tout argument qui leur est transmis, il n'est donc pas nécessaire d'obtenir le nom de la fonction actuelle.
testWarning <- function() warning("X")
testWarning()
## Warning message:
## In testWarning() : X