2012-06-10 34 views
5

Tôi đang cố gắng ghi đè save() trong R để nó tạo ra bất kỳ thư mục bị thiếu nào trước khi lưu một đối tượng. Tôi đang gặp rắc rối khi truyền một đối tượng thông qua một hàm sang một hàm khác bằng phương pháp dấu ba chấm.Làm thế nào để vượt qua đối tượng trong các hàm lồng nhau?

dụ của tôi:

save <- function(...,file){ #Overridden save() 
    target.dir <- dirname(file) #Extract the target directory 
    if(!file.exists(target.dir)) { 
     #Create the target directory if it doesn't exist. 
     dir.create(target.dir,showWarnings=T,recursive=T) 
    } 
    base::save(...,file=file.path(target.dir,basename(file))) 
} 

fun1 <- function(obj) { 
    obj1 <- obj + 1 
    save(obj1,file="~/test/obj.RData") 
} 

fun1(obj = 1) 

Đoạn mã trên kết quả do lỗi này:

Error in base::save(..., file = file.path(target.dir, basename(file))) : 
object ‘obj1’ not found 

Tôi nhận ra rằng vấn đề là đối tượng 'obj1' không tồn tại bên trong tùy chỉnh của tôi tiết kiệm (), nhưng tôi chưa tìm ra cách chuyển nó từ fun1 sang base :: save.

Tôi đã thử:

base::save(parent.frame()$...,file=file.path(target.dir,basename(file))) 

và:

base::save(list=list(...),file=file.path(target.dir,basename(file))) 

không thành công.

Mọi đề xuất?

+0

base.name Corrected để basename trong đoạn code trên. Cảm ơn Matthew. –

Trả lời

7

Bạn cần phải xác định môi trường của phụ huynh được 'cơ sở :: save':

save <- function(...,file){ #Overridden save() 
    target.dir <- dirname(file) #Extract the target directory 
    if(!file.exists(target.dir)) { 
    #Create the target directory if it doesn't exist. 
    dir.create(target.dir,showWarnings=T,recursive=T) 
    } 
    base::save(...,file=file.path(target.dir,basename(file)),envir=parent.frame()) 
} 

Lưu ý các tham số bổ sung vào cơ sở :: save gọi.

fun1 <- function(obj) { 
    obj1 <- obj + 1 
    save(obj1,file="~/test/obj.RData") 
} 

Bên cạnh đó, sử dụng '=' để chỉ định tên tham số:

fun1(obj = 1) 
+0

Tuyệt vời! Cảm ơn nhiều! –

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