2014-07-10 15 views
9

Có cách nào để truy cập giá trị trả về của hàm đang được truy tìm bởi hàm được chỉ định làm tham số thoát để theo dõi không? Nghe có vẻ khó hiểu nhưng tôi không thể đơn giản hóa câu hỏi mà không mất thông tin. Đây là một ví dụ đơn giản.Cách truy cập giá trị trả về của hàm đang được truy tìm

Chúng tôi có một chức năng đơn giản

add10 <- function(a){ 
    a + 10 
} 

Và một số chức năng mà chúng tôi muốn được gọi khi cuộc gọi đến add10 thoát.

trace.exit() <- function(){ 
... 
} 

Truy tìm được thiết lập theo cách sau.

trace(add10, exit=trace.exit) 

Và chúng tôi làm một cuộc gọi đến add10

add10(5) 

Theo tôi được biết ngay bây giờ, trace.exit sẽ được gọi sau khi add10 hoàn tất thi công. Có cách nào để truy cập giá trị trả lại của add10 bên trong trace.exit không?

Tôi cảm thấy cần phải có. Nhưng chơi với sys.frames và nhìn qua các môi trường tôi đã không thể có được nó.

Lý do làm như vậy là muốn thu hút tất cả các cuộc gọi đến một số chức năng và trả về các giá trị mà chúng cung cấp.

UPD Giải pháp với wrapper hoặc một cái gì đó tương tự như là tốt đẹp, nhưng trace đã thực hiện một mô hình trang trí, vì vậy câu hỏi của tôi là về việc truy cập giá trị trả về từ trace, không phải về giải quyết vấn đề của trang trí trong R.

+0

Rất khó để biết giá trị trả lại đang ẩn ở đâu. Trong C, các giá trị gần nhau trong [context.c] (https://github.com/wch/r-source/blob/fba3c1b0ac71bb5a681b2c1437ce2a38dfa3bb61/src/main/context.c#L197). Từ những gì tôi có thể nói, 'jumpfun' được cho là đặt giá trị trả về thành' val' trong ngữ cảnh chính xác, nhưng nó xuất hiện hàm 'on.exit' có thể chạy trong một ngữ cảnh khác. Tôi đã hy vọng nó có thể có sẵn trong '.Last.value' nhưng điều đó dường như không phải là trường hợp. Có lẽ đó là giao diện người dùng cập nhật giá trị đó. – MrFlick

Trả lời

4

Tại sao bạn không sử dụng một wrapper mà chỉ định một cách rõ ràng giá trị trả về cho một biến địa phương:

add10 <- function(a){ 
    a + 10 
} 

wrap <- function(f) { function(...) { ..ret <- f(...) } } 

add10_wrap <- wrap(add10) 

trace.exit <- function() { 
    cat(sprintf("Return value: %s\n", sys.frame(-1)$..ret)) 
} 

trace(add10_wrap, exit=trace.exit) 

add10_wrap(5) 

một nhược điểm là các wrapper sẽ luôn luôn trả về kết quả vô hình - đó là lý do ví dụ trên chỉ in những hình thức đạt sản lượng.

+0

Cảm ơn, đây là giải pháp hoàn toàn hợp lệ nhưng không thực sự có thể mở rộng. Ngoài ra tôi muốn 'add10' được gọi bằng cùng một tên, không phải bởi tên wrapper. Và dấu vết đã đưa ra một giải pháp trang trí. Bây giờ tôi chỉ tự hỏi nếu nó có thể nhận được giá trị trả lại truy cập trong đó. –

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