我有一个具有列表输出的函数。每次我运行它时,我都想用save导出结果。几次运行后,我想读取文件并比较结果。我这样做,因为我不知道会有多少任务,也许我会使用不同的计算机来计算每个任务。那么我应该如何命名归档对象,以便稍后我可以将它们全部读取?
我最好的猜测是在保存之前动态命名变量,并跟踪对象名称,但我到处都读到这是一个很大的禁忌。
那么我应该如何解决这个问题呢?
我有一个具有列表输出的函数。每次我运行它时,我都想用save导出结果。几次运行后,我想读取文件并比较结果。我这样做,因为我不知道会有多少任务,也许我会使用不同的计算机来计算每个任务。那么我应该如何命名归档对象,以便稍后我可以将它们全部读取?
我最好的猜测是在保存之前动态命名变量,并跟踪对象名称,但我到处都读到这是一个很大的禁忌。
那么我应该如何解决这个问题呢?
您可能想要使用saveRDS
andreadRDS
函数而不是save
and load
。RDS 版本功能将保存和读取没有附加名称的单个对象。您将创建对象并将其保存到文件中(使用paste0
或sprintf
创建唯一名称),然后在处理结果时,您可以一次读取一个对象,或者将多个对象读取到列表中以使用它们。
有一次给了我几个 RData 文件,它们都只有一个变量 x。为了在我的工作区中读取所有这些变量,我将每个变量依次加载到其环境中,并使用 get() 来读取其值。
tenv <- new.env()
load("file_1.RData", envir = tenv)
ls(tenv) # x
myvar1 <- get(ls(tenv), tenv)
rm(tenv)
....
可以为每个文件重复此代码。
您可以使用作用域在函数中隐藏检索到的名称,因此首先您可以将列表保存到文件中:
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 文件,它似乎返回最后保存的对象......所以现在最好坚持每个文件一个列表对象!