3

サブセット関数の紛らわしい「機能」に出くわしました(サブセット化のベクトル名として列名を使用しても機能しません):

data(iris)
Species <- unique(iris$Species)
i <- 2
Species[i]
subset(iris, subset = Species == Species[i])

sp <- unique(iris$Species)
sp[i]
subset(iris, subset = Species == sp[i])

誰かが私に説明してもらえますか、ここで何が起こっているのか、そしてその理由は?

4

1 に答える 1

9

subset()最初にデータフレーム内で言及したオブジェクトを探します。したがって、最初の例でSpecies[i]は「setosa」(と同じiris$Species[i])を返します。指定したオブジェクトがデータフレーム内に見つからない場合にのみ、Rは親フレームを調べて、そこで正しいオブジェクトを見つけます。

だから、それはすべて機能します、あなたはそれがどのように機能するかを理解していないだけです。あなたはヘルプファイルでこれを読むことができたでしょう:

サブセットはデータフレームで評価されるため、列は式の変数として(名前で)参照できることに注意してください(例を参照)。

これはどのようにして起こりますか?

その理由は、次のコード行ですsubset()

e <- substitute(subset)
r <- eval(e, x, parent.frame())
  • subset(またはe)はあなたの例にありますSpecies == Species[i]
  • xあなたの例にありますiris
  • parent.frame()あなたの例では地球環境を返します。

の呼び出しの2番目の引数は、evalx呼ばれenvirます。式が評価されるのは環境(またはリストまたはデータフレームなど)です。あなたの場合、RはデータフレームであるSpecies == Species[i] insideを評価します。 x

3番目の引数、parent.frame()はエンクロージャーです。これは、指定したデータフレームを囲む環境であり、変数がデータフレームに見つからない場合にRが検索する場所です。

も参照してください?eval

于 2012-05-30T11:55:50.767 に答える