আমি কোনও আর ডেটা ফাইল থেকে নির্দিষ্ট করে একটি ভেরিয়েবল নামের মধ্যে কীভাবে কোনও বস্তু লোড করতে পারি?


97

আপনি যখন কোনও আর ডেটা ফাইলে ব্যবহার করে কোনও ভেরিয়েবল সংরক্ষণ saveকরেন, সেশনটিতে এটি যে নামে ছিল সেটিকে এটি সংরক্ষণ করে saved পরে যখন আমি এটি অন্য সেশন থেকে লোড করতে যাই, এটি একই নামে লোড করা হয়, যা লোডিং স্ক্রিপ্টটি সম্ভবত জানতে পারে না। এই নামটি লোডিং সেশনে একই নামের একটি বিদ্যমান ভেরিয়েবল ওভাররাইট করতে পারে। বিদ্যমান ভেরিয়েবলগুলি ক্লোবারিংয়ের ঝুঁকি ছাড়াই কোনও ডেটা ফাইল থেকে কোনও নির্দিষ্ট ফাইলের নিরাপদে লোড করার কোনও উপায় আছে কি?

উদাহরণ:

সংরক্ষণের সময়:

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)

প্রতিফলিত করার জন্য আপডেট হয়েছে যে ২.১৩ এ এগুলি আর পরীক্ষামূলক নয়।
হ্যাডলি

এর অর্থ কি এই যে তারা .Rdata ফাইলগুলির মতো পুরোপুরি সমর্থিত?
রায়ান সি থম্পসন

যেহেতু এগুলি আর পরীক্ষামূলক নয়, তাই আমি এটি স্বীকৃত উত্তর হিসাবে চিহ্নিত করছি। এই আমি ব্যবহার করে যাচ্ছি।
রায়ান সি থম্পসন

কোনও অ্যাপ্লিকেশন দ্বারা (তৈরি করা ) তৈরি করা সামগ্রীর সাথে saveRDSএবং readRDSঅনুরূপভাবে, সমস্ত বস্তুর বৈশিষ্ট্যগুলি সংরক্ষণ এবং পুনরুদ্ধার করবেন attr? আমি এই পদ্ধতির পরিবর্তে saveএবং ব্যবহার করার চেষ্টা করেছি এবং loadআমার সমস্যার সমাধানের চেষ্টা করেছি। Howver, এটি মামলা হতে বলে মনে হচ্ছে না, যদি না আমি কিছু ভুল করছি: 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")

4
এটি একটি দুর্দান্ত ছোট ফাংশন। জিনিস লোড করার চেষ্টা করার সাথে সমস্যা হচ্ছিল (আমি জানি যে সমস্যা হতে চলেছে কেবল বৈশ্বিক পরিবেশে
এগুলি রাখতে চাননি

4
এর মতো কিছু বেস বেসের সাথে সম্পর্কিত
পুনরায় খেলুন

4
ঈশ্বর. এটা সত্যিই দারুন. আমার যা দরকার! # লভাইট
স্যান্ডার ডাব্লু ভ্যান ডের লান

আপনি দয়া করে জিইটি স্টেটমেন্টের যুক্তিটি প্রসারিত করতে পারেন? বাদ দেওয়ার পরিবর্তে কেন FILENAME এর সাথে মিল নেই?
nnachefski

35

আপনি একটি নতুন পরিবেশ তৈরি করতে পারেন, সেই পরিবেশে .rda ফাইলটি লোড করতে পারেন এবং সেখান থেকে বস্তুটি পুনরুদ্ধার করতে পারেন। যাইহোক, এটি কিছু বিধিনিষেধ আরোপ করে: হয় আপনি জানেন যে আপনার অবজেক্টের মূল নামটি কী, অথবা ফাইলটিতে কেবল একটি অবজেক্ট সংরক্ষিত রয়েছে।

এই ফাংশনটি সরবরাহ করা .rda ফাইল থেকে লোড হওয়া কোনও বস্তু দেয়। যদি ফাইলে একের অধিক অবজেক্ট থাকে তবে একটি স্বেচ্ছাসেবী ফিরিয়ে দেওয়া হয়।

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

4
কি new.envসত্যিই প্রয়োজনীয়? ফাংশন কলটি নিজেই একটি অস্থায়ী পরিবেশ সরবরাহ করে না?
রায়ান সি থম্পসন

আপনি @ রায়ান পরামর্শ অনুসারে ফাংশনটি সংশোধন করার সময় আপনি পুরো পরিবেশটি (রিটার্ন (এনভিভি) বা রিটার্ন (এনভায়রনমেন্ট ()) ফিরে আসতে পারেন।
ওয়াজেসিচ সোবালা

4
আপনি যদি ফাংশন এনভায়রনমেন্ট ব্যবহার করেন তবে এটিতে এফ থাকবে এবং তার পিতা-মাতা থাকবে। সম্ভবত আপনি যা চান তা নয়
হ্যাডলি

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 এর মান ক্লোবারিং এড়ানো।
রায়ান সি থম্পসন

2

যদি কোনও সংরক্ষিত আরডিটা / আরডিএস / আরডিএ ফাইলের পরিবর্তে কোনও সরল উত্স ফাইলের সাহায্যে এটি করার চেষ্টা করে তবে সমাধানটি হং ওইয়ের সরবরাহ করা ফাইলের মতোই অনুরূপ is

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)

মুদ্রণ:

[1] "আর্গের মান 7"

এবং পৃথক উত্স ফাইল টেস্টসোর্সফিল.আর.

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

একটি বস্তুর সাথে আরডিটা ফাইল

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

4
এটি কি পুরানো নামটিতে বস্তুটি লোড করবে না, এবং আবার এটি নতুন নামেও অর্পণ করবে? যদি আমি বিদ্যমান ভেরিয়েবলটি ওভাররাইট করার সম্ভাবনা সম্পর্কে উদ্বিগ্ন হই তবে এটি সাহায্য করবে না।
রায়ান সি থমসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.