为什么不build议在R中使用attach(),我应该使用什么呢?
假设我们有一个数据框x
,其中包含列job
和income
。 参考框架中的数据通常需要命令x$job
用于job
列中的数据, x$income
用于income
列中的数据。
但是,使用attach(x)
命令可以在引用相同的数据时删除数据框的名称和$
符号。 因此, x$job
变成job
, x$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
即使分配了speed
和speed
,也不会对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
中引用的dist
和speed
是原始(未转换的)值; 附加cars$speed
时的cars
价值cars$dist
和cars$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一个包含该对象的本地环境,您可以使用它而不会产生任何混淆。