2012-04-08 81 views
34

我們假設我們有一個數據框x,其中包含jobincome列。參考幀中的數據通常需要命令x$job用於job列中的數據,而x$income用於income列中的數據。爲什麼不建議在R中使用attach(),而應該使用什麼?

但是,當引用相同的數據時,使用命令attach(x)可以取消數據幀的名稱和$符號。因此,在R代碼中,x$job變成jobx$income變成income

的問題是,R中許多專家R.

的,主要的原因是什麼編碼時,建議不要使用attach()命令?應該用什麼來代替?

+4

一個問題是,你可能在內存中有其他對象,稱爲(在你的例子中)「工作」或「收入」。如果你想使用它們,但是使用'attach()'數據框'x',很容易混淆使用'x $ job'和'job',或者'x $ income'和'income'對象。 – 2012-04-08 04:20:36

回答

34

當使用它:

我用attach()時,我想大多數的統計包你得到的環境(如塔塔,SPSS)一次與一個長方形的數據集工作。

當不使用它:

然而,它變得非常混亂,當你有幾個不同的數據集,代碼很快變得不可讀特別是如果你實際上是使用R作爲粗關係數據庫中,不同的數據的矩形,所有與手頭的問題相關並且可能以不同方式匹配來自不同矩形的數據,都有相同名稱的變量。

with()函數或多個函數的參數data=是許多實例的極好替代,其中attach()是誘人的。

+5

+1用於暗示'與'。如果您希望保存比「attach」更好的打字/拼寫錯誤。 – Wayne 2012-04-08 15:16:12

12

我認爲使用attach沒有任何問題。我自己不使用它(然後,我喜歡動物,但不要保留任何東西)。當我想到attach時,我認爲是長期的。當然,當我使用劇本時,我知道它在裏面和外面。但在一個星期的時間,一個月或一年的時間,當我回到腳本時,我發現查找某個變量來自哪裏的開銷太大,太貴了。很多方法都有使得調用變量非常容易的參數data(sensu lm(x ~ y + z, data = mydata))。如果沒有,我發現with的使用令我滿意。

簡而言之,在我的書中,對於簡短的快速數據探索而言,attach是很好的,但對於我或其他人可能想要使用的腳本的開發,我儘量保持我的代碼儘可能可讀(並可轉移)。

+1

+1用於指出'data ='可以用具有它的各種命令完成相同的任務。 – Wayne 2012-04-08 15:17:13

17

不使用的另一個原因attach:它允許僅訪問數據幀的列的值以訪問(訪問),並且與連接時相同。它不是該列當前值的簡寫。舉兩個例子:

> 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 

distspeed了在計算time引用是原始(未轉化的)值;當連接cars時,cars$distcars$speed的值。

+0

我不喜歡的是你仍然需要使用等式左邊的「cars $」。 – skan 2016-05-18 09:14:31

7

如果您多次執行attach(data),例如5次,則可以在工作空間環境中看到(在search()的幫助下)您的數據已連接5次。因此,如果您取消附加(detach(data))一次,環境中仍會有data出現4次。因此,with()/within()是更好的選擇。他們幫助創建一個包含該對象的本地環境,並且可以在不產生任何混淆的情況下使用它。

相關問題