Coba sys.call(0)jika output objek panggilan ok atau jelaskan jika Anda hanya ingin nama sebagai string karakter. Di bawah ini adalah beberapa tes ini. sys.call mengembalikan nama dan argumennya dan [[1]] hanya memilih nama.
my_fun <- function() deparse(sys.call(0)[[1]])
g <- function() my_fun()
my_fun()
## [1] "my_fun"
g()
## [1] "my_fun"
Nama fungsi
Perhatikan bahwa fungsi sebenarnya tidak memiliki nama. Apa yang kita anggap sebagai nama fungsi sebenarnya hanya variabel yang memiliki fungsi dan bukan bagian dari fungsi itu sendiri. Fungsi terdiri dari argumen, tubuh, dan lingkungan - tidak ada nama fungsi di antara konstituen tersebut.
Fungsi anonim
Selain itu, orang dapat memiliki fungsi anonim dan ini dapat mengembalikan hasil aneh ketika digunakan dengan di atas.
sapply(1:3, function(x) deparse(sys.call(0)[[1]]))
## [1] "FUN" "FUN" "FUN"
Kasus tepi
Memang ada beberapa situasi, terutama yang melibatkan fungsi anonim, di mana deparseakan mengembalikan lebih dari satu elemen jadi jika Anda ingin menutup kasus tepi tersebut gunakan argumen nlines = 1 untuk menyebarkan atau menggunakan deparse (...) [[1]] atau sebagai disebutkan oleh @Konrad Rudolph dengan menggunakan deparse1 di 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]])"
Lain
Ingat . Jika alasan Anda ingin nama fungsi adalah untuk memanggil fungsi secara rekursif, maka gunakanlah Recall(). Dari file bantuan:
fib <- function(n)
if(n<=2) { if(n>=0) 1 else 0 } else Recall(n-1) + Recall(n-2)
fib(4)
## [1] 3
peringatan dan berhenti Keduanya mengeluarkan nama fungsi bersama dengan argumen apa pun yang diberikan kepada mereka sehingga tidak perlu untuk mendapatkan nama fungsi saat ini.
testWarning <- function() warning("X")
testWarning()
## Warning message:
## In testWarning() : X