2010-06-04 24 views
7

Tôi có một số tệp .Rdata chứa các hàm đã lưu như được định nghĩa bởi approxfun().sửa đổi văn bản nội dung của các đối tượng hàm hiện có

Một số các tập tin lưu trước ngày thay đổi để approxfun từ gói "cơ sở" để "số liệu thống kê", và do đó cơ thể có

PACKAGE = "base" 

và gói sai gây ra các chức năng để thất bại. Tôi có thể sửa chữa (myfun) và chỉ cần thay thế "cơ sở" với "số liệu thống kê", nhưng tôi muốn có một cách tự động neater.

Tôi có thể làm điều này với gsub() và body() bằng cách nào đó không?

tôi có thể nhận được phần nội dung và thay thế đó với

as.character(body(myfun)) 

nhưng tôi không biết làm thế nào để biến điều đó trở thành một "gọi" và thay thế định nghĩa.

(Tôi biết rằng một giải pháp tốt hơn là để đã lưu các dữ liệu ban đầu được sử dụng bởi approxfun và chỉ đơn giản là tái tạo lại chức năng, nhưng tôi tự hỏi, nếu có một cách hợp lý để sửa đổi một trong những tồn tại.)

Edit: Tôi tìm thấy nó ở đây

What ways are there to edit a function in R?

+0

thể trùng lặp của [? Có gì cách đang có để chỉnh sửa một hàm trong R] (http://stackoverflow.com/questions/2458013/what-way-are-there-to-edit-a-function-in-r) –

+0

Tôi đã thử 'body (foo) <- gsub (" PACKAGE = 'base' "," PACKAGE = 'stats' " , body (foo)) 'cho bạn, nhưng body() không trả về văn bản để bạn không thể sử dụng thao tác văn bản để thay đổi nó. Tôi đã xác minh điều này với @MrFlick –

+2

sau đó bạn có thể viết câu trả lời của riêng mình để bài đăng này không còn "chưa được trả lời" không? –

Trả lời

3

Sử dụng substitute chức năng.

Ví dụ:

myfun <- function(x,y) { 
    result <- list(x+y,x*y) 
    return(result) 
} 

Sử dụng body, điều trị myfun như một danh sách để chọn những gì bạn muốn thay đổi trong chức năng:

> body(myfun)[[2]][[3]][[2]] 
x + y 

Khi bạn thay đổi điều này, bạn phải sử dụng Hàm substitute để bạn thay thế một phần của hàm bằng một đối tượng call hoặc name, nếu thích hợp. Thay thế bằng các chuỗi ký tự không hoạt động vì các hàm không được lưu trữ hoặc hoạt động như các chuỗi ký tự.

body(myfun)[[2]][[3]][[2]] <- substitute(2*x) 

Bây giờ mảnh chọn của hàm đã được thay thế:

> myfun 
function (x, y) 
{ 
    result <- list(2 * x, x * y) 
    return(result) 
} 
Các vấn đề liên quan