2012-06-10 34 views
5

我試圖在R中覆蓋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))) 
} 

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

fun1(obj = 1) 

以上導致該錯誤代碼:

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

我意識到,問題是,對象OBJ1「沒有我的自定義內部存在的save( )函數,但我還沒有想出如何將它從fun1傳遞到base :: save。

我曾嘗試:

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

和:

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

沒有成功。

有什麼建議嗎?

+0

更正base.name代碼中的基名以上。謝謝馬修。 –

回答

7

你需要指定父的環境,「基地::保存」:

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()) 
} 

注意參數添加到基礎::保存通話。

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

此外,使用 '=',以指定的參數名:

fun1(obj = 1) 
+0

非常好!非常感謝! –

相關問題