我有一个函数,有一个列表输出。每次运行它时,我都想用save导出结果。经过几次运行后,我想读取文件并比较结果。我这样做,是因为我不知道会有多少个任务,也许我会用不同的计算机来计算每个任务。那么我应该如何命名归档对象,以便稍后可以将它们全部读入?
我最好的猜测是在保存之前动态命名变量,并跟踪对象名称,但我在任何地方都读到这是一个大禁忌。
那么我应该如何处理这个问题呢?
您可能希望使用saveRDS
和readRDS
函数而不是save
和load
。RDS版本函数将保存和读取没有附加名称的单个对象。您将创建对象并将其保存到文件中(使用paste0
或sprintf
创建唯一的名称),然后在处理结果时,您可以一次读取一个对象,或者将几个对象读入列表以使用它们。
可以使用作用域将检索到的名称隐藏在函数中,因此首先可以将列表保存到文件中:
mybiglist <- list(fred=1, john='dum di dum', mary=3)
save(mybiglist, file='mybiglist1.RData')
然后你可以通过一个函数将它加载回来,并给它起一个你喜欢的名字,可以是在另一个列表中,也可以是一个普通的对象:
# Use the fact that load returns the name of the object loaded
# and that scope will hide this object
myspecialload <- function(RD.fnam) {
return(eval(parse(text=load(RD.fnam))))
}
# now lets reload that file but put it in another object
mynewbiglist <- myspecialload('mybiglist1.RData')
mynewbiglist
$fred
[1] 1
$john
[1] "dum di dum"
$mary
[1] 3
注意,这不是一个真正的通用的'随处使用'类型的函数,因为对于一个RData文件有多个对象,它似乎返回最后保存的对象…所以现在最好每个文件只使用一个列表对象!
有一次我得到了几个RData文件,它们都只有一个名为x的变量。为了在我的工作空间中读取所有这些文件,我依次将每个变量加载到其环境中,并使用get()读取其值。
tenv <- new.env()
load("file_1.RData", envir = tenv)
ls(tenv) # x
myvar1 <- get(ls(tenv), tenv)
rm(tenv)
....
此代码可在每个文件中重复。