2016-11-08 19 views
2

かなり大きなRスクリプトで使用される共通のコード行をカプセル化された関数に分解しようとしていますが、呼び出されたときに意図したコードが実行されていないようです。 Rの仕組みや一般的な関数型プログラミングの概念的な部分が欠落しているような気がします。関数を実行するR関数

例:

ここで私は、ワークスペースをクリアするために呼び出すしたいコードの一部だ - 注意予想通り、関数の内部コードがしかし親ならば、実行したよう

clearWorkSpace <- function() { 
    rm(list= ls(all=TRUE)) 
} 

関数が呼び出されると、環境はクリアされません。

繰り返しますが、ここではすべての依存ファイルをロードするために意図された機能だ -

loadDependencies <- function() { 
    dep_files <- list.files(path="./dependencies") 
    for (file in dep_files) { 
    file_path <- paste0("./dependencies/",file) 
    source(file_path,local=TRUE) 
    } 
} 

可能ならば、読みやすい関数にコードをカプセル化することができるのは素晴らしいことです。あなたの助けを前もってありがとう。

答えて

3

作業領域は、グローバル環境とも呼ばれます。

関数は、独自の環境で実行します。。たとえば、定義されている変数のグローバル環境内の関数であるとは見えません。関数本体に定義されているxという変数を使用する方法もありますが、グローバル環境で発生する可能性があります。x

ほとんどの機能は外部環境を変更するものではありません。これは関数型プログラミングのパラダイムです。 rmsourceなどの環境を変更する関数は、通常、どの環境が変更されているかを明示できるように引数をとります。 ?rmを見ると、envirという引数があり、その引数のほとんどは、そのの詳細のセクションで説明されています。 - TRUEFALSEや環境、解析された式が評価されている場所を決定

localsourcelocal引数があります。 FALSE(デフォルト)は、ユーザのワークスペース(地球環境)に対応し、TRUEは、sourceが呼び出される環境に対応します。

あなたがsourceを呼び出すときには、明示的に明示的に地球環境が手つかずで当然のようにローカル(関数内)の環境を変更するだけにsourceに指示され、local = TRUEを設定!


私はあなたがそれらを、あなたがこのようclearWorkSpaceを修正することができるしたいと仮定して、あなたの機能を動作させるために:

clearWorkSpace <- function() { 
    rm(list= ls(all=TRUE, envir = .GlobalEnv), envir = .GlobalEnv) 
} 

単にlocal = TRUEを削除loadDependenciesため。(特に簡略化され、依存関係が上記実行している)これらの両方のために

loadDependencies = function() { 
    invisible(lapply(list.files(path = "./dependencies", full.names = TRUE), source)) 
} 

私はあなたかどうかを質問したい:あなたはより多くのRのような方法でそれを再作成することもできますが(またはそれ以上の明示的local = FALSE設定またはlocal = .GlobalEnv)これらは関数で包まれている必要があります。環境へのより多くの読書について


...ちょうどあなたがプロジェクトの作業を再開したときにRを再起動し、スクリプトの先頭に invisible(lapply(list.files(path = "./dependencies", full.names = TRUE), source))を維持するのが習慣に取得するには良いかもしれない、 The Evironments Section of Advanced Rがあります。特に、グローバル環境をハードコーディングするのではなく、さまざまなユースケースに役立つ環境を指定する方法はいくつかあります。

rm(list= ls(all=TRUE, envir = .GlobalEnv)) 

私はあなたが(たとえそれがpos引数を使用する方が良いです)、明示的に環境を設定する意味:

1

理論的にはあなただけのような何かをする必要があります。これはグローバル環境で定義されているため、clearWorkSpace関数も削除されます。これは再帰呼び出しでは失敗します。

個人的に私は決して関数またはローカルコール内でrmを使用しません。私の理解、rmであり、コンソールから呼び出され、作業スペースをクリアすることを意図しています。