Wie kann ich den Funktionsnamen innerhalb dieser nicht anonymen Funktion ermitteln? Ich gehe davon aus, dass es eine Funktion oder einen Prozess gibt, um dies zu tun, magical_r_function()
und wie die erwarteten Ausgaben aussehen würden.
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
undsys.call
sind gültige Basisfunktionen mit wenig Unterschied in "Wirkung" und "Anforderungen". Ich war also neugierig auf Einsichten, die Sie haben könnten, wenn Sie einander vorziehen.Versuchen Sie,
sys.call(0)
ob die Ausgabe eines Aufrufobjekts in Ordnung ist, oder versuchen Sie es, wenn Sie den Namen nur als Zeichenfolge verwenden möchten. Im Folgenden finden Sie einige Tests dazu. sys.call gibt sowohl den Namen als auch die Argumente zurück und [[1]] wählt nur den Namen aus.Funktionsnamen
Beachten Sie, dass Funktionen eigentlich keine Namen haben. Was wir als Funktionsnamen betrachten, sind eigentlich nur Variablen, die die Funktion enthalten und nicht Teil der Funktion selbst sind. Eine Funktion besteht aus Argumenten, Text und einer Umgebung - unter diesen Bestandteilen gibt es keinen Funktionsnamen.
Anonyme Funktionen
Darüber hinaus kann man anonyme Funktionen haben und diese können seltsame Ergebnisse liefern, wenn sie mit den oben genannten verwendet werden.
Randfälle
Es gibt einige Situationen, insbesondere bei anonymen Funktionen, in denen
deparse
mehr als ein Element zurückgegeben wird. Wenn Sie also solche Randfälle abdecken möchten, verwenden Sie das Argument nlines = 1, um deparse (...) [[1]] oder as zu deparieren Erwähnt von @Konrad Rudolph unter Verwendung von deparse1 in R 4.0.0.Andere
Rückruf . Wenn der Grund dafür ist, dass der Funktionsname rekursiv aufgerufen wird, verwenden Sie
Recall()
stattdessen. Aus der Hilfedatei:Warnung und Stopp Beide geben den Namen der Funktion zusammen mit dem an sie übergebenen Argument aus, sodass der aktuelle Funktionsname nicht abgerufen werden muss.
quelle
deparse1
Funktion elegant gelöst . Ich vermute, wir sollten damit beginnen, anstattdeparse
standardmäßig, sobald die Akzeptanz hoch genug ist.Recall
, was OP meiner Meinung nach wirklich brauchte. Jedoch Ihr Beispiel der Sequenz Fibonacci ist nicht wirklich ein guter: es hat das Problem , dass man oft die Anrufe wiederholen: fürfib(10)
,fib(8)
insgesamt 2 - mal aufgerufen (einmalfib(10)
direkt, einmal durchfib(9)
),fib(7)
3 - mal aufgerufen wird,fib(6)
heißt 5 mal. Sehen Sie, wohin das führt?Wir können auch verwenden
quelle