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.
my_fun <- function() deparse(sys.call(0)[[1]])
g <- function() my_fun()
my_fun()
## [1] "my_fun"
g()
## [1] "my_fun"
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.
sapply(1:3, function(x) deparse(sys.call(0)[[1]]))
## [1] "FUN" "FUN" "FUN"
Casos de borde
Existen algunas situaciones, particularmente que involucran funciones anónimas, donde deparsedevolverá 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.
Map(function(x) deparse(sys.call(0)[[1]], nlines = 1), 1:2)
## [[1]]
## [1] "function (x) "
##
## [[2]]
## [1] "function (x) "
Map(function(x) deparse(sys.call(0)[[1]]), 1:2) # without nlines=1
## [[1]]
## [1] "function (x) " "deparse(sys.call(0)[[1]])"
##
## [[2]]
## [1] "function (x) " "deparse(sys.call(0)[[1]])"
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:
fib <- function(n)
if(n<=2) { if(n>=0) 1 else 0 } else Recall(n-1) + Recall(n-2)
fib(4)
## [1] 3
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.
testWarning <- function() warning("X")
testWarning()
## Warning message:
## In testWarning() : X