web-dev-qa-db-ja.com

Rでattach()を使用することが推奨されないのはなぜですか?代わりに何を使用する必要がありますか?

xおよびjobを含むデータフレームincomeがあるとします。フレーム内のデータを参照するには、通常、job列のデータには_x$job_コマンド、income列のデータには_x$income_コマンドが必要です。

ただし、コマンドattach(x)を使用すると、同じデータを参照するときに、データフレームの名前と_$_シンボルを削除できます。したがって、Rコードでは_x$job_はjobになり、_x$income_はincomeになります。

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

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

46
SavedByJESUS

いつ使用するか:

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

使用しない場合:

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

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

43
Peter Ellis

attachを使用しないもう1つの理由は、データフレームの列の値へのアクセスを読み取り(アクセス)のみに許可し、接続時と同じです。その列の現在の値の省略形ではありません。 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およびdistが割り当てられていても、speedデータセットは変更されていません。

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

> 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の計算で参照されるspeedおよびtimeは、元の(変換されていない)値です。 carsがアタッチされたときのcars$distおよびcars$speedの値.

22
Brian Diggs

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

要するに、私の本では、短いクイックデータ探索にはattachで問題ありませんが、自分や他のユーザーが使用する可能性のあるスクリプトを開発する場合は、コードをできるだけ読みやすく(そして転送可能)に保つようにしています。

15
Roman Luštrik

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

11
Aquarian91