3

私はRの他のスクリプトを取り、そのような方法でそれらを操作し、それらのコードも実行するRのスクリプトを持っています。私のスクリプトは(明らかに)いくつかの変数を使用しており、他のスクリプトが共通の変数名を使用していると、混乱します。一致する変数が相互に影響を与えないように、カプセルのように他のスクリプトを実行できればと思います。

私は環境について読んでいて、たくさんの試行錯誤をしましたが、それらの本当の意味を理解していません。

例:

script1.txt
___________
i=sample(10:20,1)

script2.txt
___________
i=sample(10:20,1) 

myscript.txt
___________
other.script = c("script1.txt", "script2.txt")
for( i in 1:2 ) {
    source(other.script[i])
}
i==2

各変数「i」が他の変数に影響を与えずにその役割を果たしてくれることを願っています(特にmyscriptの変数、他の変数についてはあまり気にしません)。

4

2 に答える 2

6

あなたが探しているsys.sourceenvironmentあなたは正しい方向に進んでいました。その環境内でスクリプトを作成して実行する必要があります。

other.script = c("script1.txt", "script2.txt")
for( i in 1:2 ) {
  env<-new.env(parent = baseenv())
  sys.source(other.script[i],env)
  print(get('i',env)) # prints the value of i
}
i==2 # TRUE
于 2012-10-05T17:56:15.713 に答える
6

これに対処する最善の方法は、スクリプトによってキャプチャされた機能を分割する一連の関数を作成することです。各関数は独自の環境で実行され、変数が相互に干渉するのを防ぎます。理想的には、関数は長すぎないようにする必要があります。たとえば、10〜20行またはコードです。これらの関数を呼び出して作業を行うよりも大きなスクリプト。これを正しく行うと、スクリプトが短くなり、要点がわかりやすくなります。私は通常、これらの関数を1つ以上のスクリプトファイルに保存し、sourceそれらを必要とするスクリプトですぐに使用できるようにします。それらをパッケージにラップすることもできます。

スクリプトの順序付け方法では、すべての変数はグローバルです。つまり、プログラム全体でアクセスできます。一般に、ペストのようにグローバル変数は避ける必要があります。これは、あなたの質問が焦点を当てているためです。変数が互いに干渉しないようにするにはどうすればよいですか。私が言ったように、関数やオブジェクトへの抽象化は、これが起こらないようにする方法です。グローバル変数などの詳細については、次を参照してください。

于 2012-10-05T17:57:24.550 に答える