2012-04-08 136 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()是更好的选择。他们帮助创建一个包含该对象的本地环境,并且可以在不产生任何混淆的情况下使用它。

相关问题