2012-06-10 20 views
5

R'de save()'u geçersiz kılmaya çalışıyorum, böylece bir nesneyi kaydetmeden önce eksik dizinler oluşturur. Elips yöntemini kullanarak bir nesneyi bir işlevden diğerine geçirirken sorun yaşıyorum.İç içe geçmiş işlevlerde nesne nasıl geçilir?

Benim örnek:

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) 

bu hataya sonuçlarının üstünde kod:

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

Sorun nesne 'obj1' tasarruf benim özel iç bulunmadığını olduğunu fark () işlevi, ancak henüz fun1'den base :: save'e nasıl geçeceğini henüz anlamadım.

denedim:

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

ve:

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

başarılı.

Herhangi bir öneriniz var mı? Parametre çağrıyı kaydetmek :: tabanına eklendi

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

Not:

+0

Düzeltilmiş base.name yukarıdaki kodu İşlevi için. Sağol Matthew. –

cevap

7

Sen kurtarmak :: tabanına 'için ebeveynin ortamını belirtmek gerekir.

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

Buna ek olarak, kullanım '=' parametresi adlarını belirtmek için:

fun1(obj = 1) 
+0

Mükemmel! Çok teşekkürler! –

İlgili konular