मैं एक चर नाम में एक वस्तु को कैसे लोड कर सकता हूं जिसे मैं आर डेटा फ़ाइल से निर्दिष्ट करता हूं?


97

जब आप R डेटा फ़ाइल में चर का उपयोग करके सहेजते हैं save, तो सत्र में जो भी नाम था, उसे सहेजा गया है। जब मैं बाद में इसे दूसरे सत्र से लोड करने जाता हूं, तो इसे उसी नाम से लोड किया जाता है, जिसे लोडिंग स्क्रिप्ट संभवतः नहीं जान सकती। यह नाम लोडिंग सत्र में उसी नाम के मौजूदा चर को अधिलेखित कर सकता है। क्या किसी डेटा फ़ाइल से किसी ऑब्जेक्ट को किसी मौजूदा चर नाम में सुरक्षित रूप से लोड करने का कोई तरीका है जो मौजूदा वैरिएबल को क्लोबबेरिंग के जोखिम के बिना है?

उदाहरण:

बचत सत्र:

x = 5
save(x, file="x.Rda")

सत्र लोड हो रहा है:

x = 7
load("x.Rda")
print(x) # This will print 5. Oops.

मैं यह कैसे काम करना चाहता हूँ:

x = 7
y = load_object_from_file("x.Rda")
print(x) # should print 7
print(y) # should print 5

जवाबों:


93

यदि आप किसी एकल ऑब्जेक्ट को सहेज रहे हैं, तो .Rdataफ़ाइल का उपयोग न करें, फ़ाइल का उपयोग करें .RDS:

x <- 5
saveRDS(x, "x.rds")
y <- readRDS("x.rds")
all.equal(x, y)

यह दर्शाने के लिए अद्यतन किया जाता है कि 2.13 में ये अब प्रायोगिक नहीं हैं।
हैडली

क्या इसका मतलब यह है कि वे पूरी तरह से समर्थित हैं, जैसे .Rata फाइलें?
रयान सी। थॉम्पसन

चूंकि ये अब प्रायोगिक नहीं हैं, इसलिए मैं इसे स्वीकृत उत्तर के रूप में चिह्नित कर रहा हूं। यह वही है जो मैं उपयोग कर रहा हूं।
रयान सी। थॉम्पसन

करें saveRDSऔर readRDS, तदनुसार, बचाने के लिए और सभी वस्तु के गुणों को बहाल, (के माध्यम से एक आवेदन पत्र द्वारा बनाई भी शामिल होते हैं attr)? मैं बजाय इस दृष्टिकोण का उपयोग करने की कोशिश की saveऔर loadमेरी समस्या के लिए एक समाधान खोजने की कोशिश कर,। जब भी, यह मामला प्रतीत नहीं होता है, जब तक कि मैं कुछ गलत नहीं कर रहा हूँ: stackoverflow.com/questions/23701195/…
१३:१४ पर

38

मैं निम्नलिखित का उपयोग करता हूं:

loadRData <- function(fileName){
#loads an RData file, and returns it
    load(fileName)
    get(ls()[ls() != "fileName"])
}
d <- loadRData("~/blah/ricardo.RData")

1
यह एक छोटा सा फंक्शन है। मुद्दों को लोड करने की कोशिश करने के साथ समस्या थी (बस उन्हें वैश्विक वातावरण में रखना चाहता था क्योंकि मुझे पता है कि समस्याओं के लिए जा रहा था।
ट्रेवर नेटलॉफ

4
कुछ ऐसा ही आधार आर
रेपटैट

1
हे भगवान। यह कमाल का है। बस मैं यह चाहता हूं! # एलोवेट
सैंडर डब्ल्यू। वैन डेर लान

क्या आप GET स्टेटमेंट के तर्क पर विस्तार कर सकते हैं? बाहर करने के बजाय FILENAME से मेल क्यों नहीं?
nnachefski

35

आप एक नया वातावरण बना सकते हैं, .rda फ़ाइल को उस वातावरण में लोड कर सकते हैं, और वहां से ऑब्जेक्ट को पुनः प्राप्त कर सकते हैं। हालाँकि, यह कुछ प्रतिबंध लगाता है: या तो आप जानते हैं कि आपकी वस्तु का मूल नाम क्या है, या फ़ाइल में केवल एक ही वस्तु बचाई गई है।

यह फ़ंक्शन किसी आपूर्ति की गई .rda फ़ाइल से भरी हुई वस्तु लौटाता है। यदि फ़ाइल में एक से अधिक ऑब्जेक्ट है, तो एक मनमाना वापस आ जाता है।

load_obj <- function(f)
{
    env <- new.env()
    nm <- load(f, env)[1]
    env[[nm]]
}

3
क्या new.envवास्तव में आवश्यक है? क्या फ़ंक्शन कॉल स्वयं को एक अस्थायी वातावरण प्रदान नहीं करता है?
रयान सी। थॉम्पसन

जब आप @Ryan सुझाव के अनुसार फ़ंक्शन को संशोधित करते हैं तो आप पूरे वातावरण (रिटर्न (env) या रिटर्न (पर्यावरण)) को वापस कर सकते हैं।
वोज्शिएक सोबाला

2
यदि आप फ़ंक्शन वातावरण का उपयोग करते हैं तो इसमें f होगा और माता-पिता होंगे। शायद नहीं जो आप चाहते हैं
हैडली

27

आप भी कुछ इस तरह की कोशिश कर सकते हैं:

# Load the data, and store the name of the loaded object in x
x = load('data.Rsave')
# Get the object by its name
y = get(x)
# Remove the old object since you've stored it in y 
rm(x)

4
लोड करते समय x का मान cbbbering से बचने के लिए बिंदु है।
रयान सी। थॉम्पसन

2

यदि कोई किसी सहेजे गए Rdata / RDS / Rda फ़ाइल के बजाय एक सादे स्रोत फ़ाइल के साथ ऐसा करना चाहता है, तो समाधान @Hong Ooi द्वारा प्रदान किए गए एक के समान है।

load_obj <- function(fileName) {

  local_env = new.env()
  source(file = fileName, local = local_env)

  return(local_env[[names(local_env)[1]]])

}

my_loaded_obj = load_obj(fileName = "TestSourceFile.R")

my_loaded_obj(7)

प्रिंटों:

[१] "arg का मान Value है"

और अलग स्रोत फ़ाइल TestSourceFile.R में

myTestFunction = function(arg) {
  print(paste0("Value of arg is ", arg))
}

फिर, यह समाधान केवल तभी काम करता है यदि वास्तव में एक फ़ाइल है, यदि अधिक हैं, तो यह उनमें से एक को वापस कर देगा (शायद पहले, लेकिन यह गारंटी नहीं है)।


1

यदि .Rdataफ़ाइल में कई चर हैं (जैसा कि मेरे क्रेडिट किसी उत्तर को संपादित करने के लिए कम है) विशिष्ट संस्करण के चयन की अनुमति देने के लिए मैं @ricardo से उत्तर का विस्तार कर रहा हूं । यह .Rdataफ़ाइल में निहित चर को सूचीबद्ध करने के बाद उपयोगकर्ता इनपुट को पढ़ने के लिए कुछ लाइनें जोड़ता है ।

loadRData <- function(fileName) {
  #loads an RData file, and returns it
  load(fileName)
  print(ls())
  n <- readline(prompt="Which variable to load? \n")
  get(ls()[as.integer(n)])
}

select_var <- loadRData('Multiple_variables.Rdata')


1

एक वस्तु के साथ Rdata फ़ाइल

assign('newname', get(load('~/oldname.Rdata')))

1
क्या यह ऑब्जेक्ट को पुराने नाम में लोड नहीं करेगा, और फिर इसे नए नाम के साथ भी असाइन करेगा? यदि मैं एक मौजूदा चर को अधिलेखित करने की संभावना के बारे में चिंतित हूं तो यह मदद नहीं करेगा।
रयान सी। थॉम्पसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.