38

この投稿 ( R での遅延評価 – 割り当ては影響を受けますか? ) はいくつかの共通点をカバーしていますが、それが私の質問に答えているかどうかはわかりません。

assignかなり前に家族を発見したとき、私は使用をやめapplyましたが、これは純粋に次のような状況での優雅さのためです。

names.foo <- letters
values.foo <- LETTERS
for (i in 1:length(names.foo))
  assign(names.foo[i], paste("This is: ", values.foo[i]))

これは次のように置き換えることができます:

foo <- lapply(X=values.foo, FUN=function (k) paste("This is :", k))
names(foo) <- names.foo

これも理由です ( http://cran.r-project.org/doc/FAQ/R-FAQ.html#How-can-I-turn-a-string-into-a-variable_003f ) R-faqこれは避けるべきだと言っています。

今、私はそれassignが一般的に眉をひそめていることを知っています。しかし、私が知らない他の理由はありますか?スコーピングや遅延評価を台無しにするのではないかと思いますが、よくわかりませんか? このような問題を示すサンプル コードはすばらしいものです。

4

3 に答える 3

35

実際、これら 2 つの操作はまったく異なります。1 つ目は 26 個の異なるオブジェクトを提供しますが、2 つ目は 1 つしか提供しません。2 番目のオブジェクトは、分析での使用がはるかに簡単になります。つまり、グローバル環境で現在「緩んでいる」同様の名前の個々のオブジェクトをすべて囲い込みまたは収集するためにassign常に使用する必要があるということです。getこれらの 26 個の個別のオブジェクトを使用して何かを連続して行う方法を想像してみてください。lapply(foo, func)2 番目の戦略には単純な意志で十分です。

そのFAQの引用は、割り当てを使用してから名前を割り当てる方が簡単だと言っているだけですが、それが「悪い」ことを意味するものではありませんでした。割り当てられた値を実際に返していないため、たまたま「機能が少ない」と読んでいます。この効果は副作用のように見えます (この場合、assign戦略は 26 の個別の副作用をもたらします)。の使用はassign、「True R Way」、つまりデータオブジェクトを使用した関数型プログラミングを避ける方法として、グローバル変数を持つ言語から来た人々によって採用されているようです。ワークスペースに個別の名前の付いた項目を散らかすのではなく、リストの使い方を学ぶべきです。

使用できる別の割り当てパラダイムがあります。

 foo <- setNames(  paste0(letters,1:26),  LETTERS)

これにより、名前付きリストではなく名前付き原子ベクトルが作成されますが、ベクトル内の値へのアクセスは、 に指定された名前で行われます[

于 2013-07-09T22:53:35.410 に答える
8

assignこれは sと一緒に使用することを意図していることを指摘したいと思いenvironmentます。

その観点からすると、上記の例の「悪い」ことは、あまり適切ではないデータ構造 (listまたはdata.framevector、 ... の代わりに基本環境) を使用していることです。

補足: environments についても、$and$<-演算子が機能するため、多くの場合、明示的なassignandgetは必要ありません。

于 2013-07-10T06:58:40.993 に答える