2012-06-10 13 views
5

Próbuję przesłonić save() w R, aby utworzyć wszelkie brakujące katalogi przed zapisaniem obiektu. Mam problem z przekazaniem obiektu przez jedną funkcję do drugiej przy użyciu metody wielokropka.Jak przekazywać obiekty w zagnieżdżonych funkcjach?

Mój przykład:

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) 

Powyższy kod powoduje ten błąd:

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

zdaję sobie sprawę, że problemem jest to, że obiekt „obj1” nie istnieje w moim zwyczaju oszczędzania (), ale nie mam jeszcze pojęcia, jak przekazać go z fun1 do base :: save.

Próbowałem:

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

oraz:

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

bez powodzenia.

Wszelkie sugestie?

+0

Poprawione base.name do basename w kodzie powyżej. Dzięki Matthew. –

Odpowiedz

7

musisz określić środowisko rodzica do 'bazy :: 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()) 
} 

Note parametr dodany do bazy :: zapisać połączenie.

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

Ponadto, stosowanie '=', aby określić nazwy parametrów:

fun1(obj = 1) 
+0

Doskonale! Dzięki wielkie! –

Powiązane problemy