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

Rya*_*son 85 r variable-names rdata

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

例:

保存会话:

x = 5
save(x, file="x.Rda")
Run Code Online (Sandbox Code Playgroud)

加载会话:

x = 7
load("x.Rda")
print(x) # This will print 5. Oops.
Run Code Online (Sandbox Code Playgroud)

我希望它如何工作:

x = 7
y = load_object_from_file("x.Rda")
print(x) # should print 7
print(y) # should print 5
Run Code Online (Sandbox Code Playgroud)

had*_*ley 83

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

x <- 5
saveRDS(x, "x.rds")
y <- readRDS("x.rds")
all.equal(x, y)
Run Code Online (Sandbox Code Playgroud)

  • 是的他们现在是 (2认同)

Hon*_*Ooi 33

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

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

load_obj <- function(f)
{
    env <- new.env()
    nm <- load(f, env)[1]
    env[[nm]]
}
Run Code Online (Sandbox Code Playgroud)

  • "new.env"真的有必要吗?函数调用本身不提供临时环境吗? (3认同)
  • 如果使用函数环境,它将包含f并具有父级.可能不是你想要的 (2认同)

ric*_*rdo 32

我使用以下内容:

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

  • 像这样的东西属于基地R. (4认同)

by0*_*by0 22

您也可以尝试以下方法:

# 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)
Run Code Online (Sandbox Code Playgroud)

  • 关键是要避免在加载时破坏x的值. (4认同)

HBa*_*Bat 6

与上面的其他解决方案类似,我将变量加载到环境变量中。这样,如果我从 加载多个变量.Rda,这些变量就不会扰乱我的环境。

load("x.Rda", dt <- new.env())
Run Code Online (Sandbox Code Playgroud)

演示:

load("x.Rda", dt <- new.env())
Run Code Online (Sandbox Code Playgroud)