¿Cómo puedo obtener el nombre de la función dentro de esa función no anónima? a continuación, supongo que hay una función o proceso para hacer esto llamado magical_r_function()
y cuáles serían los resultados esperados.
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
ysys.call
son funciones básicas válidas con poca diferencia en "efecto" y "requisitos". Así que tenía curiosidad por saber qué podría tener al preferir uno sobre el otro.Pruebe
sys.call(0)
si la salida de un objeto de llamada está bien o descárguela si solo desea el nombre como una cadena de caracteres. A continuación hay un par de pruebas de esto. sys.call devuelve tanto el nombre como los argumentos y [[1]] selecciona solo el nombre.Nombres de funciones
Tenga en cuenta que las funciones en realidad no tienen nombres. Lo que consideramos como nombres de funciones en realidad son solo variables que contienen la función y no son parte de la función en sí. Una función consta de argumentos, cuerpo y un entorno; no existe un nombre de función entre esos constituyentes.
Funciones anónimas
Además, uno puede tener funciones anónimas y estas pueden devolver resultados extraños cuando se usa con lo anterior.
Casos de borde
Existen algunas situaciones, particularmente que involucran funciones anónimas, donde
deparse
devolverá más de un elemento, por lo que si desea cubrir tales casos límite, use el argumento nlines = 1 para eliminar o utilizar la función de eliminación (...) [[1]] o como mencionado por @Konrad Rudolph al usar deparse1 en R 4.0.0.Otro
Recordar . Si la razón por la que desea el nombre de la función es llamarla recursivamente, use
Recall()
en su lugar Del archivo de ayuda:advertencia y detener Ambos emiten el nombre de la función junto con cualquier argumento que se les pase, por lo que no es necesario obtener el nombre de la función actual.
fuente
deparse1
función. Supongo que deberíamos comenzar a usar eso en lugar de hacerlo dedeparse
forma predeterminada, una vez que la adopción sea lo suficientemente alta.Recall
, lo que creo es lo que OP realmente necesitaba. Sin embargo, su ejemplo de la secuencia de Fibonacci no es realmente bueno: tiene el problema de que a menudo repite las llamadas: porquefib(10)
,fib(8)
se llama 2 veces en total (una vezfib(10)
directamente, una vezfib(9)
),fib(7)
se llama 3 veces,fib(6)
se llama 5 veces. ¿Ves a dónde va esto?También podemos usar
fuente