30

私はよく、自分の環境で他のオブジェクトを表示する必要がある関数を作成します。例えば:

> a <- 3
> b <- 3
> x <- 1:5
> fn1 <- function(x,a,b) a+b+x
> fn2 <- function(x) a+b+x
> fn1(x,a,b)
[1]  7  8  9 10 11
> fn2(x)
[1]  7  8  9 10 11

fn2予想どおり、実行時に a と b を「見る」ことができるため、これらの関数はどちらも同一です。しかし、これを利用し始めると、約 30 分以内に、必要な変数 (a または b など) のいずれかを使用せずに関数を呼び出すことになります。これを利用しないと、不必要に物を回しているように感じます。

関数が必要とするものについて明示する方がよいでしょうか? または、これはインライン コメントまたは関数の他のドキュメントを介して処理する必要がありますか? より良い方法はありますか?

4

4 に答える 4

8

一部の言語ではグローバル変数を使用できないのには理由があります。グローバル変数を使用すると、コードが壊れやすくなります。

R のスコープ ルールにより、コードを怠惰な方法で記述できます。他の環境で関数に変数を使用させると、入力の手間を省くことができ、単純なケースをいじるのに最適です。

ただし、リモートで複雑なことをしている場合は、必要なすべての変数を関数に渡すことをお勧めします (または、少なくとも、変数が存在しない場合に備えてフォールバックを行うために、完全な健全性チェックを実施することをお勧めします)。 .

上記の例では:

ベスト プラクティスは、fn1 を使用することです。

または、次のようなものを試してください

 fn3 <- function(x)
   {
      if(!exists("a", envir=.GlobalEnv))
      {
         warning("Variable 'a' does not exist in the global environment")
         a <- 1
      }

      if(!exists("b", envir=.GlobalEnv))
      {
         warning("Variable 'b' does not exist in the global environment")
         b <- 2
      }

      x + a + b
   }
于 2009-07-23T08:49:28.443 に答える
3

関数でグローバル変数を使用しているとき、または変数を割り当てようとしたときに問題が発生しますか? 後者の場合は<<-、関数内の代入として使用していないためだと思います。そして、使用<<-はダークサイド1のように見えますが、あなたの目的には非常にうまくいくかもしれません. 前者の場合、関数がグローバル変数をマスクしている可能性があります。

グローバル変数をローカルでマスクするのが困難な方法で名前を付けると、役立つ場合があります。例えば:global.pimultiples <- 1:4*pi

于 2009-07-23T05:15:11.433 に答える
0

グローバル変数の使用は、ほとんどの言語で推奨されておらず、R も例外ではありません。非常に多くの場合、短い関数は、グローバル環境で設定できる短い一般的な変数名を使用します。a) 関数定義にすべての変数を含めること、b)デフォルト値を割り当てないことが最も安全です。たとえば、f=function(a,b) ではなく、f=function(a=0,b=NA) と書きます。

于 2009-07-24T01:13:09.007 に答える