4

データ フレームの列全体に値を代入できず、同じ "within" ステートメント内の 1 つの要素に代入できないのはなぜですか? コード:

foo <- data.frame( a=seq(1,10) )

foo <- within(foo, {
  b <- 1  # set all of b to 1
})

foo <- within(foo, {
  c <- 1  # set all of c to 1
  c[2] <- 20  # set one element to 20
  b[2] <- 20
})

foo

与えます:

    a  b  c
1   1  1  1
2   2 20 20
3   3  1  1
4   4  1 20
5   5  1  1
6   6  1 20
7   7  1  1
8   8  1 20
9   9  1  1
10 10  1 20

b の値は私が期待したものです。c の値が変です。列全体への割り当て (つまり b <- 1) が、単一の要素への割り当て (つまり b[2] <- 20) とは異なる "with" ステートメントにある場合、期待どおりに動作するようです。しかし、それらが同じ「内」にある場合はそうではありません。

これはバグですか、それとも R について理解できないことですか?

4

2 に答える 2

3

私の推測では、関数を「離れる」ときに新しい列への割り当てが行われるということです。するとき

c <- 1
c[2] <- 20

実際に作成したのは vector だけc <- c(1, 20)です。R がこれを新しい列に割り当てる必要がある場合、ベクトルは再利用され、表示されている 1,20,1,20,... パターンが作成されます。

于 2012-09-29T22:32:03.160 に答える
2

それは興味深いものです。

c長さ 2 までしか定義されていないという事実に関係しており、その後は典型的な R の「リサイクル規則」が引き継がれc、データ フレームの長さと一致するまで繰り返されます。(余談ですが、これは整数の倍数に対してのみ機能します。10 行のデータ フレームで長さ 3 または 4 のベクトルを複製することはできません。)

リサイクルには批判があります。特にインタラクティブにデータを探索したい場合は、動的に型付けされたインタープリター言語 R の利点だと思います。コンテナーと表現に合わせてデータを "拡張" することは、一般的には良いことです。

于 2012-09-29T22:33:15.483 に答える