Jak mogę uzyskać nazwę funkcji w ramach tej nieanonimowej funkcji? poniżej zakładam, że istnieje funkcja lub proces do wykonania tego wywołania magical_r_function()
i jakie są oczekiwane wyniki.
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
isys.call
są ważne funkcje bazowe, nieznacznie różniące się „efektu” i „wymagania”. Byłem więc ciekawy wglądu, jaki możesz mieć w preferowaniu jednego od drugiego.Spróbuj,
sys.call(0)
jeśli wynik obiektu wywołania jest poprawny lub usuń go, jeśli chcesz, aby nazwa była ciągiem znaków. Poniżej znajduje się kilka testów tego. sys.call zwraca zarówno nazwę, jak i argumenty, a [[1]] wybiera tylko nazwę.Nazwy funkcji
Pamiętaj, że funkcje w rzeczywistości nie mają nazw. To, co uważamy za nazwy funkcji, jest w rzeczywistości tylko zmiennymi, które przechowują funkcję i nie są częścią samej funkcji. Funkcja składa się z argumentów, treści i środowiska - wśród tych składników nie ma nazwy funkcji.
Funkcje anonimowe
Ponadto można mieć anonimowe funkcje, które mogą zwracać dziwne wyniki, jeśli zostaną użyte powyżej.
Skrzynie na brzeg
Istnieją pewne sytuacje, w szczególności związane z funkcjami anonimowymi, w których
deparse
zwróci więcej niż jeden element, więc jeśli chcesz uwzględnić takie przypadki krawędzi, użyj argumentu nlines = 1, aby przeprowadzić deparse lub użyć deparse (...) [[1]] lub jako wspomniane przez @Konrad Rudolph przy użyciu deparse1 w R 4.0.0.Inny
Przypomnijmy . Jeśli chcesz, aby nazwa funkcji wywoływała funkcję rekurencyjnie, użyj
Recall()
zamiast tego. Z pliku pomocy:ostrzeżenie i zatrzymanie Oba wydają nazwę funkcji wraz z przekazanym im argumentem, więc nie ma potrzeby uzyskiwania bieżącej nazwy funkcji.
źródło
deparse1
funkcji. Domyślam się, że powinniśmy zacząć używać tego zamiastdeparse
domyślnie, gdy adopcja będzie wystarczająco wysoka.Recall
, co według mnie jest tym, czego OP naprawdę potrzebował. Jednak Twój przykład sekwencji Fibonacciego nie jest tak naprawdę jeden dobry: ma ten problem, że często powtarzać połączenia: zafib(10)
,fib(8)
nazywa się 2 razy w sumie (raz przezfib(10)
bezpośrednio, raz przezfib(9)
),fib(7)
nazywany jest 3 razy,fib(6)
nazywa się 5 razy. Widzisz dokąd to zmierza?Możemy również użyć
źródło