Как я могу загрузить объект в имя переменной, которое я определяю из файла данных R? - PullRequest
82 голосов
/ 07 апреля 2011

Когда вы сохраняете переменную в файле данных 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

Ответы [ 6 ]

79 голосов
/ 07 апреля 2011

Если вы просто сохраняете один объект, не используйте файл .Rdata, используйте файл .RDS:

x <- 5
saveRDS(x, "x.rds")
y <- readRDS("x.rds")
all.equal(x, y)
32 голосов
/ 07 апреля 2011

Вы можете создать новую среду, загрузить файл .rda в эту среду и извлечь объект оттуда. Однако это накладывает некоторые ограничения: либо вы знаете, каково оригинальное имя вашего объекта, либо в файле сохранен только один объект.

Эта функция возвращает объект, загруженный из предоставленного файла .rda. Если в файле более одного объекта, возвращается произвольный.

load_obj <- function(f)
{
    env <- new.env()
    nm <- load(f, env)[1]
    env[[nm]]
}
29 голосов
/ 23 августа 2014

Я использую следующее:

loadRData <- function(fileName){
#loads an RData file, and returns it
    load(fileName)
    get(ls()[ls() != "fileName"])
}
d <- loadRData("~/blah/ricardo.RData")
21 голосов
/ 17 сентября 2013

Вы также можете попробовать что-то вроде:

# 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)
2 голосов
/ 28 сентября 2016

Если кто-то хочет сделать это с простым исходным файлом, а не с сохраненным файлом 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)

Печать:

[1] "Значение аргумента равно 7"

А в отдельном исходном файле TestSourceFile.R

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

Опять же, это решение работает, только если существует ровно один файл, если их больше, тогда он просто вернет один из них (вероятно, первый, но это не гарантировано).

0 голосов
/ 15 февраля 2019

Я расширяю ответ от @ricardo, чтобы разрешить выбор конкретной переменной, если файл .Rdata содержит несколько переменных (так как мои кредиты невелики для редактирования ответа).Он добавляет несколько строк для чтения пользовательского ввода после перечисления переменных, содержащихся в файле .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')

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...