これは、関数を定義するファイルがある状況です。それを呼び出しましょう。tmpFunctions.R
それとそれを使用するファイル (と呼びましょうtmpRunner.R
)。の関数はtmpFunctions.R
、定義されていないが、 のグローバル スコープで定義された変数を意図せずtmpRunner.R
に使用します。関数が から呼び出された時点tmpRunner.R
で、変数は既にグローバル スコアに存在するため、インタープリターはエラーを発行せず、プログラムはスムーズに実行されますが、間違った結果が生成されます。次に例を示します。
tmpFuncitons.R:
my.func <- function(x){
return(X * 2) # typo; should be error
}
tmpRunner.R
source('tmpFunctions.R')
X <- 10 #calling my.func(...) from this point on will not cause runtime errors
for(i in seq(10)){
print(sprintf('%s ==> %s', i, my.func(i)))
}
出力:
> source('C:/tmp/tmpRunner.R')
[1] "1 ==> 20"
[1] "2 ==> 20"
[1] "3 ==> 20"
[1] "4 ==> 20"
[1] "5 ==> 20"
[1] "6 ==> 20"
[1] "7 ==> 20"
[1] "8 ==> 20"
[1] "9 ==> 20"
[1] "10 ==> 20"
Perl の に似た方法でこれを防ぐ方法、または関数をグローバル スコープに公開せずuse strict
にインポートする方法はありますか (ほとんどの場合そうではありません)。tmpFunctions.R
また、R 用のソース コード静的解析ツール (コードを実行する前に警告メッセージを取得するため) を探してみましたが、何も見つかりませんでした。