2012-06-10 13 views
5

Sto cercando di ignorare save() in R in modo da creare eventuali directory mancanti prima di salvare un oggetto. Ho problemi a passare un oggetto attraverso una funzione a un'altra utilizzando il metodo ellissi.Come passare l'oggetto nelle funzioni annidate?

Il mio esempio:

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) 

Il codice sopra i risultati di questo errore:

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

mi rendo conto che il problema è che l'oggetto 'obj1' non esiste dentro la mia personalizzato save (), ma non ho ancora capito come passarlo da fun1 a base :: save.

ho provato:

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

e:

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

senza successo.

Qualche suggerimento?

+0

base.name Corretto al nome base nel codice qui sopra. Grazie Matteo. –

risposta

7

è necessario specificare l'ambiente del genitore di 'base :: 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()) 
} 

Nota il parametro aggiunto alla base :: salvare chiamata.

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

Inoltre, l'uso '=' per specificare i nomi dei parametri:

fun1(obj = 1) 
+0

Eccellente! Grazie mille! –

Problemi correlati