我可以将一个保存的R对象加载到一个新的对象名称中吗?

wecizke3  于 2023-03-15  发布在  其他
关注(0)|答案(9)|浏览(136)

当你用save把一个变量保存在一个R数据文件中时,它会以保存它的会话中的任何名称保存。当我稍后从另一个会话加载它时,它会以相同的名称加载。加载脚本不可能知道的变量名。2这个变量名可能会覆盖加载会话中已有的同名变量。有没有一种方法可以安全地将对象从数据文件加载到指定的变量名中,而不会有损坏现有变量的风险?

示例:

保存会话:

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
au9on6nz

au9on6nz1#

您可以创建一个新环境,将.rda文件加载到该环境中,然后从该环境中检索对象。但是,这会带来一些限制:要么你知道你的对象的原始名称,要么只有一个对象保存在文件中。
此函数返回从提供的.rda文件加载的对象。如果文件中有多个对象,则返回任意一个。

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

of1yzvn42#

您也可以尝试类似的操作:

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

kmbjn2e33#

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

3zwjbxry4#

具有一个对象的Rdata文件

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

xoshrz7s5#

如果有人希望使用普通源文件而不是保存的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]“参数值为7”
并在单独的源文件TestSourceFile.R中

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

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

j91ykkif

j91ykkif6#

我从@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')
wvt8vs2t

wvt8vs2t7#

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

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

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

vmpqdwk3

vmpqdwk38#

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

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

bvjxkvbb9#

我使用以下代码:

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

相关问题