2012-06-10 16 views
5

मैं आर में 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))) 
} 

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

fun1(obj = 1) 

ऐसा गलती से हुआ परिणामों के ऊपर कोड:

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

मुझे पता है समस्या यह है कि वस्तु 'obj1' सेव अपने कस्टम के अंदर मौजूद नहीं है कि () फ़ंक्शन, लेकिन मैंने अभी तक यह नहीं पता लगाया है कि इसे fun1 से base :: save से कैसे पास किया जाए।

मैं कोशिश की है:

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

और:

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

कोई सफलता के साथ।

कोई सुझाव?

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

नोट पैरामीटर आधार को जोड़ा गया कॉल बचाने :::

+0

सही base.name उपरोक्त कोड में basename करने के लिए। धन्यवाद मैथ्यू। –

उत्तर

7

आप 'आधार बचाने ::' के लिए माता पिता के पर्यावरण को निर्दिष्ट करने की जरूरत है।

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

इसके अलावा, उपयोग '=' पैरामीटर नाम निर्दिष्ट करने के लिए:

fun1(obj = 1) 
+0

उत्कृष्ट! बहुत धन्यवाद! –

संबंधित मुद्दे