試してみてくださいsys.call(0)
コールオブジェクトの出力は、あなただけの文字列として名をしたい場合は、[OK]というか、逆パースある場合。以下は、これに関するいくつかのテストです。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(...)[[1]]または@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