2012-09-03 6 views
6

Có ai biết cách viết hàm F nhận cuộc gọi hàm (nói, trung bình (x = 1:10)) làm đối số và chỉ trả về tên hàm được gọi (có nghĩa là)?trích xuất tên cuộc gọi chức năng từ một cuộc gọi hàm

nỗ lực tốt nhất của tôi cho đến nay được tóm tắt dưới đây

(function(x1){ 

    return(deparse(substitute(x1))) 

})(mean(x = 1:10)) 
### 'mean(x = 1:10)' 

Thay đổi x1 (gọi hàm) để một biểu thức trước khi de-phân tích dường như không giúp được gì nhiều: trả về

(function(x1){ 

    return(deparse(as.expression(substitute(x1)))) 

})(mean(x = 1:10)) 
# "expression(mean(x = 1:10))" 

Nếu có thể, tôi muốn có thể sử dụng các hàm ẩn danh làm đối số, vì vậy F phải trả về (hàm (x) in (x)) cho (hàm (x) in (x)) (1). Nếu bạn cần bất kỳ làm rõ cảm thấy tự do để bình luận. Cảm ơn.

edit1: chỉ cần lưu ý, tôi muốn tránh kiểm tra dấu ngoặc đơn đầu tiên và trích xuất mã trước mã đó (cho "mean (x = 1:10)" sẽ trả về "mean"), là " xấu (Fun_nAme" thực sự là một tên hàm quy phạm pháp luật trong R.

Câu hỏi được trả lời: Câu trả lời Josh O'Brien là hoàn hảo: chức năng F thỏa mãn các điều kiện trên được

F <- function(x) deparse(substitute(x)[[1]]) 

Nó hoạt động độc đáo đối với các toán tử nhị phân, hàm chuẩn và hàm ẩn danh

Trả lời

8

Dưới đây là một chức năng đơn giản mà làm những gì bạn muốn:

F <- function(x) deparse(substitute(x)[[1]]) 

F(mean(x=1:10)) 
# [1] "mean" 

F((function(x) print (x))(1)) 
# [1] "(function(x) print(x))" 

F(9+7) 
# [1] "+" 
1

Tôi không biết những gì bạn đang cố gắng để làm hoặc nếu đó là một ý tưởng tốt hoặc nếu đây là những gì bạn muốn nhưng đây là một Whack vào nó với regex:

FUN <- function(x1){ 
    z <- deparse(substitute(x1)) 
    list(fun=strsplit(z, "\\(")[[c(1, 1)]], 
    eval=x1) 
} 

FUN(mean(x = 1:10))