如何将对象加载到从R数据文件指定的变量名称中?


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

Answers:


93

如果只保存一个对象,则不要使用.Rdata文件,而要使用.RDS文件:

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

更新以反映在2.13中这些不再是实验性的。
hadley 2011年

这是否意味着它们像.Rdata文件一样受到完全支持?
Ryan C. Thompson

由于这些不再是实验性的,因此我将其标记为可接受的答案。这就是我一直在使用的。
瑞安·汤普森

saveRDS和和是否readRDS相应地保存和恢复所有对象的属性,包括由应用程序创建的属性(通过attr)?我尝试使用此方法代替saveload,试图找到解决我问题的方法。但是,除非我做错了什么,否则情况似乎并非如此:stackoverflow.com/questions/23701195/…
Aleksandr Blekh

37

我使用以下内容:

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

1
这是一个很棒的小功能。当时有问题,试图加载的东西(没有想只是把它们在全球环境中,因为我知道,要去的问题。
特雷弗Nederlof

4
像这样的东西属于基本R
Repmat '16

1
我的天啊。这太棒了。正是我所需要的!#loveit
Sander W. van der Laan

您能否扩展一下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)或return(environment()))。
Wojciech Sobala 2011年

2
如果使用函数环境,它将包含f并有一个父级。可能不是您想要的东西
hadley 2011年

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

如果有人希望使用纯源文件而不是保存的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))
}

同样,此解决方案仅在只有一个文件的情况下才有效,如果有更多文件,则将仅返回其中一个(可能是第一个,但这不能保证)。


1

我正在扩展@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')


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.