列x
およびjob
を含むデータフレームincome
があるとします。フレーム内のデータを参照するには、通常、job
列のデータには_x$job
_コマンド、income
列のデータには_x$income
_コマンドが必要です。
ただし、コマンドattach(x)
を使用すると、同じデータを参照するときに、データフレームの名前と_$
_シンボルを削除できます。したがって、Rコードでは_x$job
_はjob
になり、_x$income
_はincome
になります。
問題は、Rの多くの専門家がRでコーディングするときにattach()
コマンドを使用しないようにアドバイスしていることです。
その主な理由は何ですか?代わりに何を使用する必要がありますか?
いつ使用するか:
一度に1つの長方形のデータセットを処理するほとんどの統計パッケージ(例:Stata、SPSS)で取得する環境が必要な場合は、attach()
を使用します。
使用しない場合:
ただし、いくつかの異なるデータセットがある場合、特にRを大まかなリレーショナルデータベースとして使用している場合、コードが非常に乱雑になり、コードがすぐに読み取れなくなります。異なる長方形からのデータを照合するさまざまな方法には、同じ名前の変数があります。
with()
関数、または多くの関数の_data=
_引数は、attach()
が魅力的な多くのインスタンスの優れた代替手段です。
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
の値.
attach
の使用には何の問題もないと思います。私自身は使用していません(それでも、私は動物が大好きですが、飼っていません)。 attach
について考えるとき、私は長期的に考えます。確かに、私がスクリプトで作業しているときは、スクリプトの内外を知っています。しかし、スクリプトに戻る1週間、1か月、または1年間で、特定の変数がどこからのものであるかを検索するオーバーヘッドが高すぎます。多くのメソッドにはdata
引数があり、変数を簡単に呼び出すことができます(sensulm(x ~ y + z, data = mydata)
)。そうでない場合、私はwith
の使用法に満足しています。
要するに、私の本では、短いクイックデータ探索にはattachで問題ありませんが、自分や他のユーザーが使用する可能性のあるスクリプトを開発する場合は、コードをできるだけ読みやすく(そして転送可能)に保つようにしています。
attach(data)
を複数回、たとえば5回実行すると、(search()
を使用して)ワークスペース環境でデータが5回アタッチされていることがわかります。したがって、(detach(data)
)を一度アタッチ解除しても、環境にはdata
が4回存在します。したがって、with()/within()
がより良いオプションです。それらはそのオブジェクトを含むローカル環境を作成するのに役立ち、混乱を生じることなくそれを使用できます。