在R和通用工作区管理中组合或合并工作区
我经常发现自己在一个计算系统关闭/繁忙时将工作区转移到不同的scratch驱动器等,或者,我想同时运行两个冗长的软件包,以节省时间并在不同的位置两次加载相同的工作区 正因为如此,我非常喜欢一种在工作空间之间查看不同对象的方法,以及一种组合它们的方法,只将新的、更改的或更新的工作空间对象添加到类似的工作空间中。这对我非常有用 到目前为止,我靠的是手工记笔记,两周后我就被我的涂鸦弄糊涂了。我真的只是想学习好的工作习惯和习惯,让这一切变得更容易 一般来说,我真的很想了解更多关于工作区管理的知识,以及有经验的用户如何为长期、持续的项目保持工作区的全面和整洁。我经常使用Rstudio,但远程工作或使用我们的HPC系统可能会有点滞后和笨拙,所以我倾向于使用命令行和交互式会话 我认为制作对象列表可能是关键,但我希望能够更容易地对事物进行注释,可能使用用于制作对象的数据和参数等在R和通用工作区管理中组合或合并工作区,r,project,workspace,R,Project,Workspace,我经常发现自己在一个计算系统关闭/繁忙时将工作区转移到不同的scratch驱动器等,或者,我想同时运行两个冗长的软件包,以节省时间并在不同的位置两次加载相同的工作区 正因为如此,我非常喜欢一种在工作空间之间查看不同对象的方法,以及一种组合它们的方法,只将新的、更改的或更新的工作空间对象添加到类似的工作空间中。这对我非常有用 到目前为止,我靠的是手工记笔记,两周后我就被我的涂鸦弄糊涂了。我真的只是想学习好的工作习惯和习惯,让这一切变得更容易 一般来说,我真的很想了解更多关于工作区管理的知识,以及有
谢谢。我认为需要在这里构建自己的功能,并执行以下操作:
- 使用以下命令逐个加载工作区:
load()
- 重命名工作区的每个元素,以防止在加载另一个工作区或将其放入列表时重写
- 使用以下内容检查工作区的时间戳:
file.info()
- 并且只保留最新的对象,然后保存在某个最新的工作区中
for(i in 1:10){
dummy <- rnorm(1)
Sys.sleep(1.3)
save(dummy,file=paste("test",i,".Rdata",sep=""))
}
DUMMY <- list()
timestamps <- NULL
for(i in 1:10){
filename <- paste("test",i,".Rdata",sep="")
load(filename)
DUMMY[[i]] <- dummy
timestamps[i] <- file.info(filename)$mtime
}
uptodate <- unlist(timestamps)==max(unlist(timestamps))
dummy <- unlist(DUMMY[uptodate])
save(dummy,file="uptodate.Rdata")
for(1:10中的i){
dummy我可以回答你问题的一部分,但剩下的就留给别人吧
假设您的工作区有许多对象,在退出R之前,请保存工作区并将其重命名为.RData为work1.RData。如果您在linux上,请尝试以下重命名文件:
mv .RData work1.RData
然后打开一个新的R会话,创建任意数量的对象,并像以前一样保存。如果要将此工作区转移到其他系统,可以重命名此工作区
现在您有了两个workspace.RData二进制文件。您可以使用
load ("work1.RData")
然后,像这样检查工作区中加载的对象
ls()
objects()
在这种情况下,save.image()
也很有用
HTH我认为关键是将您的工作区加载到单独的环境中,然后确定如何合并它们(如果有)
首先,让我们制作一些要保存的对象
set.seed(1)
a <- data.frame(1:10, 1:10)
b <- rnorm(10)
现在清除工作区并加载工作区。但是,不要加载它们
在.GlobalEnv
中,将它们加载到自己的环境中
rm(list=ls(all=TRUE)) # clear .GlobalEnv
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"
您可以在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"
是的,太好了!我不知道file.info。它不适用于工作区内的对象,有没有等效的方法?如果有一种简单的方法可以为工作区中的每个文件添加后缀/前缀,这将特别有用。我想这必须在加载前单独完成?如果我能找到一个ni,也许我会再次浏览和评论ce way.“[…]有类似的方法吗?”不,我不这么认为。据我所知,对象确实有创建/修改属性。也许你可以向包含这些信息的工作区添加一个对象(例如,通过日期()。谢谢,这与我已经做的非常相似,即在进行了足够大的更改或函数运行后,我会以增量形式保存.image(file=“myData_1.X.RData”),但大多数对象都非常相似,只需要选择一些更新、重新运行或新建的对象。我只希望ls()在R中有更多的细节可用。如果我在3个不同的地方做了类似的事情,那么一个很好的方法来组合变化的对象并不像上面建议的那样简单。我想我应该在创建对象时写出它们,在linux信息中制作一个日期戳。我刚刚意识到,当导入保存的对象时,属性是不保留!+1其他答案没有错,但我肯定认为使用环境是实现手头目标的最干净的方式。我将通过这些例子来说明。我不知道环境。Thanks@jksl,请参见?环境
,?获取
,?分配
。此外,您还可以在Environment将其转换为一个列表,您可能更习惯于使用它。
rm(list=ls(all=TRUE)) # clear .GlobalEnv
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(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
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"
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, nothing has been assigned to it yet
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"