我认为关键是将工作区加载到单独的环境中,然后确定如何合并它们(如果需要的话)。
首先,让我们创建一些要保存的对象。
set.seed(1)
a <- data.frame(1:10, 1:10)
b <- rnorm(10)
一种跟踪对象创建时间的方法是设置一个属性。缺点是当更新对象时,您必须记得更新它。(有关替代方案,请参见帖子的最后部分)
d <- structure(data.frame(b), updated=Sys.time())
attr(d, 'updated')
你可以在保存工作区之前将当前时间分配给一个变量,以知道何时保存它(
file.info
可能是更好的替代方案,
PeterM 建议)
updated <- Sys.time()
dir.create('~/tmp') # create a directory to save workspace in.
save.image('~/tmp/ws1.RData')
d[1, 1] <- 1 #make a change to `d`
attr(d, "updated") <- Sys.time() # don't forget to update the `updated` attribute
e <- b * a # add a new object
updated <- Sys.time()
save.image('~/tmp/ws2.RData')
现在清空工作区并加载工作区。 但是,不要将它们加载到
.GlobalEnv
中,而是将它们加载到它们自己的环境中。
rm(list=ls(all=TRUE))
w1 <- new.env()
w2 <- new.env()
load('~/tmp/ws1.RData', envir=w1)
load('~/tmp/ws2.RData', envir=w2)
> ls(w1)
[1] "a" "b" "d" "updated"
> ls(w2)
[1] "a" "b" "d" "e" "updated"
> with(w1, updated)
[1] "2012-10-06 12:34:09 CDT"
> with(w2, updated)
[1] "2012-10-06 12:35:02 CDT"
> attr(w1$d, 'updated')
[1] "2012-10-06 12:34:06 CDT"
> attr(w2$d, 'updated')
[1] "2012-10-06 12:35:02 CDT"
你可能对类似 .ls.objects
的函数感兴趣。
> .ls.objects(pos=w1)
Type Size PrettySize Rows Columns
a data.frame 872 [1] 872 10 2
b numeric 168 [1] 168 10 NA
d data.frame 1224 [1] 1224 10 1
updated POSIXct 312 [1] 312 1 NA
> .ls.objects(pos=w2)
Type Size PrettySize Rows Columns
a data.frame 872 [1] 872 10 2
b numeric 168 [1] 168 10 NA
d data.frame 1224 [1] 1224 10 1
e data.frame 1032 [1] 1032 10 2
updated POSIXct 312 [1] 312 1 NA
您可以使用自定义包装器来跟踪对象何时更新,这需要围绕
assign
进行操作。
myAssign <- function(x, value, ...) {
attr(value, "updated") <- Sys.time()
assign(x, value, ...)
}
> myAssign("b", w1$b[1:2], pos=w1)
> w1$b
[1] -0.6264538 0.1836433
attr(,"updated")
[1] "2012-10-06 12:44:55 CDT"
最后,如果你想要更高级一些,你可以创建一个主动绑定,这样当你的对象发生变化时,它的updated
属性总是会得到更新。
f <- local({
delayedAssign('x', stop('object not found'))
function(v) {
if (!missing(v)) x <<- structure(v, updated=Sys.time())
x
}
})
makeActiveBinding('ab', f, .GlobalEnv)
> ab
Error in function (v) : object not found
> ab <- data.frame(1:10, y=rnorm(10))
> attr(ab, 'updated')
[1] "2012-10-06 12:46:53 CDT"
> ab <- data.frame(10:1, y=rnorm(10))
> attr(ab, 'updated')
[1] "2012-10-06 12:47:04 CDT"