2012-06-10 33 views
5

Estoy intentando anular save() en R para que cree los directorios faltantes antes de guardar un objeto. Tengo problemas para pasar un objeto de una función a otra utilizando el método de puntos suspensivos.¿Cómo pasar el objeto en funciones anidadas?

Mi ejemplo:

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) 

El código anterior produce este error:

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

que se dan cuenta de que el problema es que el objeto 'obj1' no existe dentro de mi reserva del personalizado () función, pero todavía no he descubierto cómo pasarlo de fun1 a base :: guardar.

que he intentado:

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

y:

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

sin éxito.

¿Alguna sugerencia?

+0

base.name corregido para basename en el código anterior. Gracias Matthew. –

Respuesta

7

es necesario especificar el entorno de los padres a '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 el parámetro añade a la base :: save llamada.

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

Además, el uso '=' para especificar nombres de los parámetros:

fun1(obj = 1) 
+0

¡Excelente! ¡Muchas gracias! –

Cuestiones relacionadas