Como posso obter o nome da função nessa função não anônima? abaixo, presumo que exista uma função ou processo para fazer isso chamado magical_r_function()
e quais seriam as saídas esperadas.
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
esys.call
são funções básicas válidas com pouca diferença em "efeito" e "requisitos". Então, eu estava curioso para saber o que você pode ter ao preferir um ao outro.Tente
sys.call(0)
se a saída de um objeto de chamada está ok ou remova-a se você quiser apenas o nome como uma sequência de caracteres. Abaixo estão alguns testes disso. sys.call retorna o nome e os argumentos e o [[1]] seleciona apenas o nome.Nomes de funções
Observe que as funções não têm nomes. O que consideramos nomes de funções são na verdade apenas variáveis que mantêm a função e não fazem parte da própria função. Uma função consiste em argumentos, corpo e ambiente - não há nome de função entre esses constituintes.
Funções anônimas
Além disso, pode-se ter funções anônimas e elas podem retornar resultados estranhos quando usadas com as opções acima.
Casos de borda
Existem algumas situações, particularmente envolvendo funções anônimas, em
deparse
que retornará mais de um elemento; portanto, se você quiser cobrir esses casos de borda, use o argumento nlines = 1 para separar ou use deparse (...) [[1]] ou como mencionado por @Konrad Rudolph usando deparse1 no R 4.0.0.De outros
Lembre-se . Se o motivo pelo qual você deseja que o nome da função seja chamar recursivamente a função, use-o
Recall()
. No arquivo de ajuda:aviso e parada Ambos emitem o nome da função, juntamente com qualquer argumento que lhes seja passado, para que não seja necessário obter o nome atual da função.
fonte
deparse1
função. Suponho que devemos começar a usá-lo em vez dedeparse
por padrão, uma vez que a adoção seja alta o suficiente.Recall
, o que considero ser o que o OP estava realmente precisando. No entanto, seu exemplo da sequência de Fibonacci não é realmente bom: ele tem o problema de repetir frequentemente as chamadas: poisfib(10)
,fib(8)
é chamado 2 vezes no total (uma vezfib(10)
diretamente, uma vez porfib(9)
),fib(7)
é chamado 3 vezes,fib(6)
é chamado 5 vezes. Veja para onde isso está indo?Também podemos usar
fonte