在R和通用工作区管理中组合或合并工作区

在R和通用工作区管理中组合或合并工作区,r,project,workspace,R,Project,Workspace,我经常发现自己在一个计算系统关闭/繁忙时将工作区转移到不同的scratch驱动器等,或者,我想同时运行两个冗长的软件包,以节省时间并在不同的位置两次加载相同的工作区 正因为如此,我非常喜欢一种在工作空间之间查看不同对象的方法,以及一种组合它们的方法,只将新的、更改的或更新的工作空间对象添加到类似的工作空间中。这对我非常有用 到目前为止,我靠的是手工记笔记,两周后我就被我的涂鸦弄糊涂了。我真的只是想学习好的工作习惯和习惯,让这一切变得更容易 一般来说,我真的很想了解更多关于工作区管理的知识,以及有

我经常发现自己在一个计算系统关闭/繁忙时将工作区转移到不同的scratch驱动器等,或者,我想同时运行两个冗长的软件包,以节省时间并在不同的位置两次加载相同的工作区

正因为如此,我非常喜欢一种在工作空间之间查看不同对象的方法,以及一种组合它们的方法,只将新的、更改的或更新的工作空间对象添加到类似的工作空间中。这对我非常有用

到目前为止,我靠的是手工记笔记,两周后我就被我的涂鸦弄糊涂了。我真的只是想学习好的工作习惯和习惯,让这一切变得更容易

一般来说,我真的很想了解更多关于工作区管理的知识,以及有经验的用户如何为长期、持续的项目保持工作区的全面和整洁。我经常使用Rstudio,但远程工作或使用我们的HPC系统可能会有点滞后和笨拙,所以我倾向于使用命令行和交互式会话

我认为制作对象列表可能是关键,但我希望能够更容易地对事物进行注释,可能使用用于制作对象的数据和参数等


谢谢。

我认为需要在这里构建自己的功能,并执行以下操作:

  • 使用以下命令逐个加载工作区:

    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"