2012-06-10 13 views
5

Ich versuche, save() in R zu überschreiben, so dass es fehlende Verzeichnisse vor dem Speichern eines Objekts erstellt. Ich habe Probleme, ein Objekt mithilfe der Ellipsenmethode durch eine Funktion an eine andere zu übergeben.Wie übergebe ich Objekte in verschachtelten Funktionen?

Mein Beispiel:

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) 

Der obige Code führt zu diesem Fehler:

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

Mir ist klar, dass das Problem ist, dass das Objekt 'obj1' save nicht in meinem benutzerdefinierten existieren () Funktion, aber ich habe noch nicht herausgefunden, wie man es von fun1 nach base :: save übergibt.

Ich habe versucht:

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

und:

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

ohne Erfolg.

Irgendwelche Vorschläge?

+0

Korrigierte base.name oben im Code zu basename. Danke Matthew. –

Antwort

7

Sie müssen die Eltern-Umgebung 'base :: save' angeben:

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

Hinweis der Parameter auf der Basis hinzugefügt :: Aufruf zu speichern.

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

Zusätzlich Verwendung '=' Parameternamen angeben:

fun1(obj = 1) 
+0

Ausgezeichnet! Vielen Dank! –

Verwandte Themen