我怎样才能加载一个对象到我从R数据文件指定的variables名?

当使用保存将variables保存在R数据文件中时,它将保存在保存它的会话中的任何名称下。 当我稍后从另一个会话加载它时,会加载相同的名称,加载脚本不可能知道。 这个名称可以覆盖加载会话中相同名称的现有variables。 有没有办法安全地从数据文件加载一个对象到指定的variables名没有破坏现有variables的风险?

例:

保存会话:

 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 

如果您只保存单个对象,请不要使用.Rdata文件,而应使用.RDS文件:

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

您可以创build一个新环境,将.rda文件加载到该环境中,然后从中检索该对象。 但是,这确实施加了一些限制:要么知道对象的原始名称是什么,要么只有一个对象保存在文件中。

该函数返回从提供的.rda文件加载的对象。 如果文件中有多个对象,则返回任意一个对象。

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

你也可以尝试这样的:

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

我使用以下内容:

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

如果有人想用一个简单的源文件来做这个,而不是保存的Rdata / RDS / Rda文件,这个解决scheme与@Hong Ooi提供的解决scheme非常相似

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

再说一次,这个解决scheme只有在只有一个文件的情况下才有效,如果还有更多的话,那么它只会返回其中的一个(可能是第一个,但不能保证)。