Comment puis-je obtenir le nom de la fonction dans cette fonction non anonyme? ci-dessous, je suppose qu'il existe une fonction ou un processus pour ce faire appelé magical_r_function()
et quelles seraient les sorties attendues.
my_fun <- function(){
magical_r_function()
}
my_fun()
## [1] "my_fun"
foo_bar <- function(){
magical_r_function()
}
foo_bar()
## [1] "foo_bar"
ballyhoo <- function(){
foo_bar()
}
ballyhoo()
## [1] "foo_bar"
tom_foolery <- foo_bar
tom_foolery()
## [1] "tom_foolery"
match.call
etsys.call
sont des fonctions de base valides avec peu de différence dans "l'effet" et "les exigences". J'étais donc curieux de savoir ce que vous pourriez avoir en préférant l'un à l'autre.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.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.
Cas de bord
Il existe certaines situations, en particulier impliquant des fonctions anonymes, où
deparse
retournera 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.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: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.
la source
deparse1
fonction. Je suppose que nous devrions commencer à utiliser cela au lieu dedeparse
par défaut, une fois que l'adoption est suffisamment élevée.Recall
, ce qui me semble être ce dont OP avait vraiment besoin. Cependant, votre exemple de la séquence de Fibonacci n'est pas vraiment bon: il a le problème que vous répétiez souvent les appels: carfib(10)
,fib(8)
est appelé 2 fois au total (une foisfib(10)
directement, une fois parfib(9)
),fib(7)
est appelé 3 fois,fib(6)
est appelé 5 fois. Vous voyez où cela va?Nous pouvons également utiliser
la source