59

xjobとを含むデータ フレームがあるとしますincome。フレーム内のデータを参照するには、通常、列内のデータと列x$job内のデータに対するコマンドが必要です。jobx$incomeincome

ただし、このコマンドを使用すると、同じデータを参照するときattach(x)に、データ フレームの名前と$シンボルを省略できます。したがって、R コードでは、となりますx$jobjobx$incomeincome

attach()問題は、R の多くの専門家が、Rでコーディングするときにコマンドを使用しないようにアドバイスしていることです。

その主な理由は何ですか?代わりに何を使用する必要がありますか?

4

4 に答える 4

48

いつ使用するか:

attach()一度に 1 つの長方形のデータセットを操作するほとんどの統計パッケージ (Stata、SPSS など) で得られる環境が必要な場合 に使用します。

使用しない場合:

ただし、いくつかの異なるデータセットがある場合、特にRを大まかなリレーショナルデータベースとして実際に使用している場合、コードは非常に乱雑になり、コードはすぐに判読不能になります。さまざまな長方形からのデータを照合するさまざまな方法には、同じ名前の変数があります。

with()関数、または多くの関数の引数は、魅力的なdata=多くのインスタンスの優れた代替手段です。attach()

于 2012-04-08T07:09:40.123 に答える
27

使用しないもう1つの理由attach:データフレームの列の値へのアクセスを読み取り(アクセス)のみに許可し、アタッチされたときと同じようにします。これは、その列の現在の値の省略形ではありません。2つの例:

> head(cars)
  speed dist
1     4    2
2     4   10
3     7    4
4     7   22
5     8   16
6     9   10
> attach(cars)
> # convert stopping distance to meters
> dist <- 0.3048 * dist
> # convert speed to meters per second
> speed <- 0.44707 * speed
> # compute a meaningless time
> time <- dist / speed
> # check our work
> head(cars)
  speed dist
1     4    2
2     4   10
3     7    4
4     7   22
5     8   16
6     9   10

に割り当てられていてcarsも、データセットに変更は加えられませんでした。distspeed

データセットに明示的に割り当てられた場合...

> head(cars)
  speed dist
1     4    2
2     4   10
3     7    4
4     7   22
5     8   16
6     9   10
> attach(cars)
> # convert stopping distance to meters
> cars$dist <- 0.3048 * dist
> # convert speed to meters per second
> cars$speed <- 0.44707 * speed
> # compute a meaningless time
> cars$time <- dist / speed
> # compute meaningless time being explicit about using values in cars
> cars$time2 <- cars$dist / cars$speed
> # check our work
> head(cars)
    speed   dist      time     time2
1 1.78828 0.6096 0.5000000 0.3408862
2 1.78828 3.0480 2.5000000 1.7044311
3 3.12949 1.2192 0.5714286 0.3895842
4 3.12949 6.7056 3.1428571 2.1427133
5 3.57656 4.8768 2.0000000 1.3635449
6 4.02363 3.0480 1.1111111 0.7575249

計算で参照されるとはdist、元の(変換されていない)値です。との値が添付されました。speedtimecars$distcars$speedcars

于 2012-04-09T19:52:06.390 に答える
17

使用しても問題ないと思いますattach。私自身はそれを使用しません(繰り返しますが、私は動物が大好きですが、どちらも飼っていません)。を考えるときattach、私は長期的に考えます。確かに、スクリプトで作業しているときは、スクリプトの内外を把握しています。しかし、1 週間、1 か月、または 1 年後にスクリプトに戻ると、特定の変数がどこから来ているかを検索するオーバーヘッドが高すぎることに気付きます。多くのメソッドには、data変数の呼び出しを非常に簡単にする引数 ( sensu lm(x ~ y + z, data = mydata)) があります。withそうでない場合は、満足のいく使用法を見つけます。

要するに、私の本では、添付は簡単なデータ探索には問題ありませんが、私や他の人が使用したいスクリプトを開発する場合は、コードをできるだけ読みやすく (そして転送可能) に保つようにしています。

于 2012-04-08T09:04:24.427 に答える
14

attach(data)複数回、たとえば 5 回実行するsearch()と、ワークスペース環境でデータが 5 回アタッチされたことを ( を使用して) 確認できます。したがって、1 回デアタッチ ( detach(data)) するとdata、環境内に 4 回存在することになります。したがって、with()/within()より良いオプションがあります。それらは、そのオブジェクトを含むローカル環境を作成するのに役立ち、混乱を招くことなく使用できます。

于 2016-12-12T04:31:46.263 に答える