2

編集:

次のような厄介なコードがあります。

readcsvfile()
dopreprocessingoncsvfile()
readanothercsvfile()
moreprocessing()
# etc ...

数日かけて、これは徐々に長く複雑になり、実行に 1 ~ 2 分以上かかるようになりました。R は環境の保存に非常に優れているため、R 環境の変数を意味します。これを加速する簡単な方法は次のとおりです。

if( !exists("init.done") {
readcsvfile()
dopreprocessingoncsvfile()
readanothercsvfile()
moreprocessing()
init.done = T
}

ただし、特に処理中に関数を微調整することがあるため、もう少しきめ細かくするのが好きなので、世界全体のリロードを見ずに再実行したいので、次のように変更しました。

if( !exists("somedata" ) ) {
    somedata <- readcsvfile()
}
# ... etc ... same for the others

ただし、次のような間違いを犯すことがあります。正直に言うと、私は単純に怠け者でもあります。もっと簡潔な方法があるのに、なぜ長い if ステートメントを書く必要があるのでしょうか。私はよく次のような間違いをします。

  • スクリプトを実行するたびに変数が実行され続けることに気付くことで、if で変数の名前を間違って入力します。
  • if 句の 2 番目のブラケットを見逃すと、検出、変更、および再実行に 10 ~ 15 秒かかるため、面倒です :-P

すっごく....私の提案する解決策はcacheVar、定義が少し似ている関数を書くことです:

cacheVar <- function( varname, expression ) {
    if( !exists(varname ) {
        setValueMagic( varname, evalMagic(expression) )
    }
}

... and whose usage looks like:

cacheVar("foo", {
    # some expression that calculates the value of foo
})

...値「varname」がまだ存在しない場合にのみ式が評価されます。

これを具体化するために不足している情報は次のとおりだと思います。

  • これはすでに存在しますか?
  • setValueMagicRで書くには?
  • evalMagicRで書くには?

編集:親フレームに割り当てる必要があるため、もう少し複雑です。おそらくparent.envorなどを使用parent.frameします。

4

0 に答える 0