Hãy thử sys.call(0)
nếu một đầu ra đối tượng cuộc gọi là ok hoặc depely nếu bạn chỉ muốn tên như một chuỗi ký tự. Dưới đây là một vài thử nghiệm về điều này. sys.call trả về cả tên và đối số và [[1]] chỉ chọn ra tên.
my_fun <- function() deparse(sys.call(0)[[1]])
g <- function() my_fun()
my_fun()
## [1] "my_fun"
g()
## [1] "my_fun"
Tên hàm
Lưu ý rằng các hàm không thực sự có tên. Những gì chúng ta coi là tên hàm thực sự chỉ là các biến giữ hàm và không phải là một phần của chính hàm đó. Một hàm bao gồm các đối số, phần thân và một môi trường - không có tên hàm trong số các thành phần đó.
Chức năng ẩn danh
Hơn nữa, người ta có thể có các chức năng ẩn danh và chúng có thể trả về kết quả lạ khi được sử dụng với ở trên.
sapply(1:3, function(x) deparse(sys.call(0)[[1]]))
## [1] "FUN" "FUN" "FUN"
Trường hợp cạnh
Có tồn tại một số tình huống, đặc biệt liên quan đến các hàm ẩn danh, nơi deparse
sẽ trả về nhiều hơn một phần tử, vì vậy nếu bạn muốn bao gồm các trường hợp cạnh như vậy, hãy sử dụng đối số nlines = 1 để làm mờ hoặc sử dụng từ chối (...) [[1]] hoặc như được đề cập bởi @Konrad Rudolph bằng cách sử dụng depzzy1 trong 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]])"
Khác
Nhớ lại . Nếu lý do bạn muốn tên hàm là gọi đệ quy hàm thì sử dụng Recall()
thay thế. Từ tệp trợ giúp:
fib <- function(n)
if(n<=2) { if(n>=0) 1 else 0 } else Recall(n-1) + Recall(n-2)
fib(4)
## [1] 3
cảnh báo và dừng Cả hai đều phát hành tên của hàm cùng với bất kỳ đối số nào được truyền cho chúng để không cần lấy tên hàm hiện tại.
testWarning <- function() warning("X")
testWarning()
## Warning message:
## In testWarning() : X