6

1 つのコンピューティング システムがダウン/ビジー状態のときに、ワークスペースを別のスクラッチ ドライブなどに転送したり、時間を節約するために 2 つの長いパッケージを同時に実行したり、同じワークスペースを別の場所で 2 回ロードしたりしたいと思うことがよくあります。

このため、ワークスペース間で異なるオブジェクトを表示する方法と、それらを組み合わせて、新しい、変更された、または更新されたワークスペース オブジェクトのみを同様のワークスペースに追加する方法が本当に好きです。これは私にとって非常に便利です。

これまでのところ、私は手動のメモ取りに頼っており、2 週間後に落書きに困惑しています。私は本当に、この種のことをより簡単にするための優れた作業慣行と習慣を学びたいと思っています.

一般的に、ワークスペースの管理と、経験豊富なユーザーが長期にわたる進行中のプロジェクトのためにワークスペースを包括的かつ整然と保つ方法についてもっと学びたいと思っています. 私は Rstudio をよく使用しますが、リモートで作業したり、HPC システムを使用したりすると、少しラグがあり扱いにくい場合があるため、コマンド ラインと対話型セッションを使用する傾向があります。

おそらくオブジェクトのリストを作成することが鍵になると思いますが、オブジェクトの作成に使用されるデータやパラメーターなどを使用して、より簡単に注釈を付けられるようにしたいと考えています.

ありがとう。

4

3 に答える 3

4

ここでは、次のようにして独自の機能を構築する必要があると思います。

  • 以下を使用して、ワークスペースを 1 つずつロードします。

    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")
于 2012-10-06T15:03:01.633 に答える
3

重要なことは、ワークスペースを別々の環境にロードしてから、それらをマージする方法を理解することだと思います (もしあれば)。

まず、保存するオブジェクトをいくつか作成しましょう。

set.seed(1)
a <- data.frame(1:10, 1:10)
b <- rnorm(10)

オブジェクトがいつ作成されたかを追跡する 1 つの方法は、属性を設定することです。欠点は、オブジェクトを更新するときに忘れずに更新する必要があることです。(代替案については、投稿の最後の部分を参照してください)

d <- structure(data.frame(b), updated=Sys.time())
attr(d, 'updated')
#[1] "2012-10-06 12:34:06 CDT"

ワークスペースを保存する直前に現在の時間を変数に割り当てて、いつ保存したかを知ることができます ( PeterMが提案しfile.infoた方が良い代替手段である可能性があります)。

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)) # 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

> .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, 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"
于 2012-10-06T17:54:55.757 に答える
1

私はあなたの質問の一部に答えることができますが、残りは SO の他の人に任せます。

ワークスペースに多くのオブジェクトがあり、R を終了する前に、ワークスペースを保存し、名前を .RData から work1.RData に変更するとします。Linux を使用している場合は、ファイルの名前を変更してみてください。

mv .RData work1.RData

次に、新しい R セッションを開き、好きなだけオブジェクトを作成して、以前と同様に保存します。他のシステムに移動したい場合は、このワークスペースの名前を変更できます。

これで、2 つのワークスペース .RData バイナリ ファイルができました。を使用して、それらを単一の現在のワークスペースにロードできます。

load ("work1.RData")

その後、このようにワークスペースにロードされたオブジェクトを確認します

 ls() 
 objects()

save.image()こんな場合にも役立ちます。

HTH

于 2012-10-06T15:07:02.430 に答える