sys.call(0)
如果您只想将该名称作为字符串,请尝试调用对象的输出是否正常,或者否决。以下是一些测试。sys.call返回名称和参数,[[1]]仅选择名称。
my_fun <- function() deparse(sys.call(0)[[1]])
g <- function() my_fun()
my_fun()
## [1] "my_fun"
g()
## [1] "my_fun"
功能名称
请注意,函数实际上没有名称。我们所谓的函数名称实际上只是保存函数的变量,而不是函数本身的一部分。函数由参数,主体和环境组成-在这些组成部分中没有函数名称。
匿名功能
此外,一个可以具有匿名函数,当与上述函数一起使用时,它们可能返回奇怪的结果。
sapply(1:3, function(x) deparse(sys.call(0)[[1]]))
## [1] "FUN" "FUN" "FUN"
边缘情况
确实存在某些情况,特别是涉及匿名函数的情况,这些情况deparse
将返回多个元素,因此,如果要涵盖此类边缘情况,请使用nlines = 1参数进行deparse或使用deparse(...)[[1]]或as @Konrad Rudolph在R 4.0.0中使用deparse1提到。
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]])"
其他
回想一下。如果您想要函数名称的原因是递归调用函数,请Recall()
改用。从帮助文件:
fib <- function(n)
if(n<=2) { if(n>=0) 1 else 0 } else Recall(n-1) + Recall(n-2)
fib(4)
## [1] 3
警告和停止这两个命令都会发出函数名称以及传递给它们的任何参数,因此无需获取当前函数名称。
testWarning <- function() warning("X")
testWarning()
## Warning message:
## In testWarning() : X