How can I load an object into a variable name that I specify from an R data file?

当您使用 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
55230 次浏览

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

此函数返回从提供的。Rda 文件。如果文件中有多个对象,则返回一个任意对象。

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

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

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

你也可以试试这样的方法:

# 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 文件,那么解决方案非常类似于@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))
}

同样,这个解决方案只有在正好有一个文件的情况下才能工作,如果有更多的文件,那么它将只返回其中的一个(可能是第一个,但这不能保证)。

如果 .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')

Rdata file with one object

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

与上面的其他解决方案类似,我将变量加载到一个环境变量中。这样,如果我从 .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

接下来是@ricardo,另一个使用(有效地)单独环境的例子

load_rdata <- function(file_path) {
res <- local({
load(file_path)
return(get(ls()))
})
return(res)
}

类似的警告,只期望返回一个对象