2012-08-05 12 views
18

मैंने खुद को save का उपयोग करके बनाई गई Rdata फ़ाइल में एक या दो डेटा ऑब्जेक्ट्स को अपडेट करने की आवश्यकता की स्थिति में पाया है। अगर मैं फ़ाइल लोड करने के लिए सावधान नहीं हूं, तो मैं फ़ाइल में कुछ ऑब्जेक्ट्स को फिर से सहेजना भूल सकता हूं। उदाहरण के तौर पर, मैं sysdata.rda (आंतरिक उपयोग के लिए लुक-अप टेबल जिन्हें मैं निर्यात नहीं करना चाहता) में संग्रहीत कुछ वस्तुओं के साथ एक पैकेज पर काम कर रहा हूं और केवल व्यक्तिगत वस्तुओं को अपडेट करने के बारे में चिंता करना चाहता हूं।मौजूदा Rdata फ़ाइल को अद्यतन करना

यदि ऐसा करने का कोई मानक तरीका है तो मैंने काम करने में कामयाब नहीं किया है, इसलिए अपना स्वयं का फ़ंक्शन बनाया है।

resave <- function (..., list = character(), file = stop("'file' must be specified")) { 
    # create a staging environment to load the existing R objects 
    stage <- new.env() 
    load(file, envir=stage) 
    # get the list of objects to be "resaved" 
    names <- as.character(substitute(list(...)))[-1L] 
    list <- c(list, names) 
    # copy the objects to the staging environment 
    lapply(list, function(obj) assign(obj, get(obj), stage)) 
    # save everything in the staging environment 
    save(list=ls(stage, all.names=TRUE), file=file) 
} 

हालांकि यह ओवरकिल जैसा प्रतीत होता है। क्या ऐसा करने के लिए एक बेहतर/आसान तरीका है?

एक तरफ, क्या मैं यह मानने में सही हूं कि फ़ंक्शन कॉल के बाद किसी फ़ंक्शन के दायरे में बनाया गया नया वातावरण नष्ट हो जाता है?

+0

क्या कोई (या कम से कम मुझे :-)) आश्चर्य करता है कि क्यों 'सेव' में "संलग्न" विकल्प नहीं है। मैं आर-सहायता पूछूंगा और यदि कोई उपयोगी उत्तर है तो यहां वापस आएं। –

+1

ठीक है, मैंने देखा: https://stat.ethz.ch/pipermail/r-help/2006- मार्च/101259.html मूल रूप से वही सुझाव देता है जो उत्तर @flodel प्रदान करता है। व्यक्तिगत रूप से मैं इसे 'एपेंड = टी' विकल्प के रूप में आधार 'सेव' फ़ंक्शन में जोड़ना चाहता हूं, लेकिन यह एक बड़ा सौदा नहीं है। –

+0

मैंने 'as.character (विकल्प (सूची (...)) का उपयोग किया) [- 1 एल]' ('सेव' से कॉपी करना)। मेलिंग सूची प्रतिक्रिया को देखते हुए, 'asarse' का उपयोग' as.character' के बजाय किया जाता है। दो दृष्टिकोणों के पेशेवर/विपक्ष क्या हैं? – seancarmody

उत्तर

21

यहाँ एक से थोड़ा छोटा संस्करण है:

resave <- function(..., list = character(), file) { 
    previous <- load(file) 
    var.names <- c(list, as.character(substitute(list(...)))[-1L]) 
    for (var in var.names) assign(var, get(var, envir = parent.frame())) 
    save(list = unique(c(previous, var.names)), file = file) 
} 

मैं इस तथ्य load समारोह लोड चर का नाम देता है का फायदा उठाया, तो मैं बजाय एक बनाने के समारोह के परिवेश इस्तेमाल कर सकते हैं। और get का उपयोग करते समय, मैं केवल उस माहौल को देखने के लिए सावधान था जिस से फ़ंक्शन कहा जाता है, यानी parent.frame()

x1 <- 1 
x2 <- 2 
x3 <- 3 
save(x1, x2, x3, file = "abc.RData") 

x1 <- 10 
x2 <- 20 
x3 <- 30 
resave(x1, x3, file = "abc.RData") 

load("abc.RData") 
x1 
# [1] 10 
x2 
# [1] 2 
x3 
# [1] 30 
+0

धन्यवाद! एक प्रश्न: तर्क 'सूची' और 'फ़ाइल' क्यों कार्य के माहौल में नहीं हैं? – seancarmody

+1

वे फ़ंक्शन के पर्यावरण में हैं, लेकिन मुझे सावधान रहना है कि उन्हें सहेज न दें: देखें कि मैं केवल 'अद्वितीय (सी (पिछला, var.names)) बचाता हूं। – flodel

+0

बेशक। धन्यवाद! बहुत बढ़िया जवाब। – seancarmody

0

मैं stackoverflow पैकेज में @ flodel के जवाब का एक रिफैक्टर्ड संस्करण को शामिल किया है:

यहाँ एक अनुकरण है। यह थोड़ा अधिक रक्षात्मक होने के लिए स्पष्ट रूप से वातावरण का उपयोग करता है।

resave <- function(..., list = character(), file) { 
    e <- new.env() 
    load(file, e) 
    list <- union(list, as.character(substitute((...)))[-1L]) 
    copyEnv(parent.frame(), e, list) 
    save(list = ls(e, all.names=TRUE), envir = e, file = file) 
} 
संबंधित मुद्दे