命名存档对象的最佳实践?

时间:2013-01-03 15:06:26

标签: r file parallel-processing

我有一个具有 list 输出的函数。每次运行时,我都希望使用 save 导出结果。几次运行后,我想读取文件并比较结果。我这样做,因为我不知道将会有多少任务,也许我将使用不同的计算机来计算每项任务。那么我应该如何命名已归档的对象,以便稍后我可以全部阅读它们?

我最好的猜测是在保存之前动态命名变量,并跟踪对象名称,但我到处都读到这是一个很大的禁忌。

那我该怎么办呢?

3 个答案:

答案 0 :(得分:5)

您可能希望使用saveRDSreadRDS函数,而不是saveload。 RDS版本函数将保存和读取没有附加名称的单个对象。您可以创建对象并将其保存到文件中(使用paste0sprintf创建唯一名称),然后在处理结果时,您可以一次读取一个对象,或者将多个对象读入列表与他们合作。

答案 1 :(得分:0)

您可以使用范围在函数中隐藏检索到的名称,因此首先您可以将列表保存到文件中:

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文件,它似乎返回最后保存的对象...所以最好现在每个文件都有一个列表对象!

答案 2 :(得分:0)

有一次我得到了几个RData文件,它们都只有一个名为x的变量。为了在我的工作区中读取所有这些内容,我将每个变量按顺序加载到其环境中,并使用get()读取其值。

tenv <- new.env()
load("file_1.RData", envir = tenv)
ls(tenv) # x
myvar1 <- get(ls(tenv), tenv)
rm(tenv)
....

可以为每个文件重复此代码。