为什么不build议在R中使用attach(),我应该使用什么呢?

假设我们有一个数据框x ,其中包含列jobincome 。 参考框架中的数据通常需要命令x$job用于job列中的数据, x$income用于income列中的数据。

但是,使用attach(x)命令可以在引用相同的数据时删除数据框的名称和$符号。 因此, x$job变成jobx$income变成R代码中的income

问题在于R中的许多专家build议在R编码时不要使用attach()命令。

这主要是什么原因? 应该用什么来代替?

何时使用它:

当我想要在大多数统计软件包(例如Stata,SPSS)中同时使用一个矩形数据集的环境时,使用attach()

何时不使用它:

然而,如果你有几个不同的数据集,特别是如果你实际上使用R作为一个粗糙的关系数据库的时候,代码就变得非常混乱,代码很快就变得不可读了,在这个数据库中,不同的矩形数据都与当前的问题相关,匹配来自不同矩形的数据的各种方式,具有相同名称的variables。

with()函数或许多函数的data=参数是attach()诱惑的许多实例的绝佳select。

不使用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 

即使分配了speedspeed ,也不会对cars数据集进行更改。

如果明确分配回数据集…

 > 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 

在计算time中引用的distspeed是原始(未转换的)值; 附加cars$speed时的cars价值cars$distcars$speed

我认为使用attach没有任何问题。 我自己不使用它(然后,我喜欢动物,但不要保留任何东西)。 当我想到attach ,我认为是长期的。 当然,当我使用脚本的时候,我知道它在里面和外面。 但在一个星期的时间,一个月或一年的时间,当我回到脚本时,我发现search某个variables来自哪里的开销太大,太贵了。 很多方法都有data参数,使得调用variables非常容易(sensu lm(x ~ y + z, data = mydata) x〜y lm(x ~ y + z, data = mydata) )。 如果不是的话,我觉得这个用法让我满意。

简而言之,在我的书中,对于简短的快速数据探索,附加是可以的,但为了开发我或其他人可能想要使用的脚本,我尽量保持我的代码可读性(并且可以转移)。

如果多次执行附加(数据),例如5次,则可以看到(在search()的帮助下)您的数据已经在工作空间环境中附加了5次。 所以,如果你去附加(分离(数据))一次,环境中仍然会有“数据”出现4次。因此,使用()/ within()是更好的select。 他们帮助创build一个包含该对象的本地环境,您可以使用它而不会产生任何混淆。