使用save
将变量保存在R数据文件中时,它会以保存它的会话中的名称保存。当我稍后从另一个会话加载它时,它加载了相同的名称,加载脚本不可能知道。此名称可能会覆盖加载会话中同名的现有变量。有没有办法将数据文件中的对象安全地加载到指定的变量名中,而没有破坏现有变量的风险?
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
答案 0 :(得分:79)
如果您只是保存单个对象,请不要使用.Rdata
文件,请使用.RDS
文件:
x <- 5
saveRDS(x, "x.rds")
y <- readRDS("x.rds")
all.equal(x, y)
答案 1 :(得分:32)
您可以创建新环境,将.rda文件加载到该环境中,然后从那里检索对象。但是,这确实会带来一些限制:要么您知道对象的原始名称是什么,要么文件中只保存了一个对象。
此函数返回从提供的.rda文件加载的对象。如果文件中有多个对象,则返回任意一个对象。
load_obj <- function(f)
{
env <- new.env()
nm <- load(f, env)[1]
env[[nm]]
}
答案 2 :(得分:27)
我使用以下内容:
loadRData <- function(fileName){
#loads an RData file, and returns it
load(fileName)
get(ls()[ls() != "fileName"])
}
d <- loadRData("~/blah/ricardo.RData")
答案 3 :(得分:21)
您也可以尝试以下方式:
# 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 :(得分:3)
与上面的其他解决方案类似,我将变量加载到环境变量中。这样,如果我从 .Rda
加载多个变量,它们就不会干扰我的环境。
load("x.Rda", dt <- new.env())
演示:
x <- 2
y <- 1
save(x, y, file = "mydata.Rda")
rm(x, y)
x <- 123
# Load 'x' and 'y' into a new environment called 'dt'
load("mydata.Rda", dt <- new.env())
dt$x
#> [1] 2
x
#> [1] 123
答案 5 :(得分: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))
}
同样,这个解决方案只有在有一个文件的情况下才有效,如果有更多,那么它只会返回其中一个(可能是第一个,但不保证)。
答案 6 :(得分:1)
一个对象的Rdata文件
assign('newname', get(load('~/oldname.Rdata')))
答案 7 :(得分:0)
如果.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')