2017-12-14 126 views
5

Giả sử tôi có hàm cần tham số k và trả về một hàm khác có tham số n nhưng sử dụng k trong phần chức năng của hàm.Cách in nội dung chức năng bằng biến được phân tích cú pháp

makeFn <- function(k) { 
    function(n){ 
    rep(k,n) 
    } 
} 

five <- makeFn(5) 

five(3) 
# [1] 5 5 5 

body(five) 
# { 
# rep(k, n) 
# } 

Làm thế nào tôi có thể in cơ thể của five để nó hiển thị rep(5,n) thay vì rep(k,n)?

+0

Bạn cần giải pháp linh hoạt như thế nào? Có thể có nhiều cấp hàm lồng nhau hơn không? Trong trường hợp đơn giản này, bạn có thể sử dụng 'replace' với đối số" env "thuận tiện của nó. SInce 'replace' sẽ không đánh giá đối số đầu tiên của nó, chúng ta cần xây dựng một cuộc gọi như' eval (call ("replace", body (năm), environment (five))) ' –

Trả lời

0

Một tùy chọn là kết hợp evalbquote.

makeFn <- function(k) { 
    eval(bquote(function(n) rep(.(k),n))) 
} 

five <- makeFn(5) 
body(five) 
# rep(5, n) 

Ký hiệu .() đang nói bquote để đánh giá bất cứ điều gì là trong ngoặc đơn, sau đó bao gồm các kết quả trong biểu thức.

Các vấn đề liên quan