1. ホーム
  2. r

[解決済み] "<<-" はどのように使うのですか?(Rのスコーピングアサイン)?

2022-04-24 09:18:01

質問

について読み終えたところです。 Rのイントロダクションにあるスコーピング について非常に興味を持っています。 <<- を割り当てた。

マニュアルでは、1つの(非常に興味深い)例として <<- 理解できた気がする。まだ足りないのは、これがどのような場合に役に立つのかという文脈です。

そこで、どのような場面で <<- は面白い/役に立つかもしれません。 それを使うことの危険性は何でしょうか(見失いやすいようです)、また、共有したいと思うようなヒントがあれば教えてください。

解決方法は?

<<- は、状態を維持するためにクロージャと組み合わせて使うのが最も有効です。 以下は、最近の私の論文からの抜粋です。

<ブロッククオート

クロージャとは、他の関数によって書かれた関数のことです。クロージャは というのは 囲む 親環境の 関数内のすべての変数とパラメータにアクセスすることができます。 関数を使用します。これは、2つのレベルを持つことができるので、便利です。 パラメータがあります。パラメータの1つのレベル(親)は 関数が動作します。もう一方のレベル(子)は、仕事をします。以下は 次の例は、この考え方を使って、どのように べき乗関数である。親関数( power ) は子関数を作成します。 ( squarecube ) が、実際にハードワークを行う。

power <- function(exponent) {
  function(x) x ^ exponent
}

square <- power(2)
square(2) # -> [1] 4
square(4) # -> [1] 16

cube <- power(3)
cube(2) # -> [1] 8
cube(4) # -> [1] 64

また、変数を2段階で管理できることで、関数が親の環境の変数を変更できるようになり、関数の呼び出しにまたがって状態を維持することが可能になります。異なるレベルの変数を管理するための鍵は、二重矢印の代入演算子 <<- . 通常のシングルアローの代入とは異なり ( <- ) は、常に現在のレベルで動作しますが、二重矢印演算子は親レベルの変数を変更することができます。

このため、次の例のように、ある関数が何回呼ばれたかを記録するカウンターを保持することが可能である。毎回 new_counter が実行されると、環境を作成し、カウンタを初期化します。 i を作成し、新しい関数を作成します。

new_counter <- function() {
  i <- 0
  function() {
    # do something useful, then ...
    i <<- i + 1
    i
  }
}

新しい関数はクロージャであり、その環境は包含環境である。クロージャが counter_onecounter_two が実行されると、それぞれを包含する環境のカウンタを変更し、現在のカウントを返します。

counter_one <- new_counter()
counter_two <- new_counter()

counter_one() # -> [1] 1
counter_one() # -> [1] 2
counter_two() # -> [1] 1