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

Когда вы сохраняете переменную в файле данных R с помощью save, она сохраняется под любым именем, которое оно имело в сеансе, который ее сохранил. Когда я перейду позже, чтобы загрузить его из другого сеанса, он загружается с тем же именем, которое невозможно узнать по загрузке script. Это имя может перезаписать существующую переменную с тем же именем в сеансе загрузки. Есть ли способ безопасно загрузить объект из файла данных в указанное имя переменной без риска сбивания существующих переменных?

Пример:

Сохранение сеанса:

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

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

# 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)

Ответ 5

В случае, если кто-то ищет это с помощью простого исходного файла, а не с сохраненным файлом 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] "Значение arg равно 7"

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

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

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

Ответ 6

Я расширяю ответ от @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')

Ответ 7

Файл Rdata с одним объектом

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