ลอง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 (... ) [[1]] หรือ พูดถึงโดย @Konrad Rudolph โดยใช้ deparse1 ใน 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]])"
อื่น ๆ
จำ หากเหตุผลที่คุณต้องการชื่อฟังก์ชั่นคือการเรียกใช้ฟังก์ชั่นซ้ำแล้วใช้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