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

Sav*_*SUS 43 r dataframe r-faq

我们假设我们有一个x包含列job和的数据框income.引用帧中的数据通常需要列中x$job数据的命令job和列x$income中的数据income.

但是,使用该命令attach(x)允许$在引用相同数据时取消数据帧的名称和符号.因此,x$job变得jobx$income成为income在R代码.

问题是R中的许多专家建议在R中attach()编码时不要使用该命令.

主要原因是什么?应该用什么呢?

Pet*_*lis 40

何时使用:

attach()当我想要你在大多数统计数据包(例如Stata,SPSS)中获得的环境中,我一次使用一个矩形数据集.

何时不使用它:

然而,当你有几个不同的数据集时,它变得非常混乱并且代码很快变得不可读,特别是如果你实际上使用R作为粗略的关系数据库,其中不同的数据矩形都与手头的问题相关并且可能在从不同矩形匹配数据的各种方法,具有相同名称的变量.

with()函数或data=参数许多功能,是许多情况下,优秀的替代方案attach()是诱人.

  • +1表示`with`.如果你想保存比'attach`更好的输入/拼写错误. (8认同)

Bri*_*ggs 22

不使用的另一个原因是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
Run Code Online (Sandbox Code Playgroud)

没有变化的制造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
Run Code Online (Sandbox Code Playgroud)

计算中引用的dist和原始的(未转换的)值; 附加的值和时间.speedtimecars$distcars$speedcars


Rom*_*rik 14

我认为使用没有任何问题attach.我自己不使用它(然后再说,我喜欢动物,但也不要保留任何动物).我想起来attach,我认为是长期的.当然,当我使用脚本时,我内心深处都知道它.但是在一个星期的时间里,一个月或一年,当我回到脚本时,我发现搜索特定变量所在的开销,太贵了.很多方法都有这个data参数使得调用变量变得非常简单(sensu lm(x ~ y + z, data = mydata)).如果没有,我发现使用with令我满意.

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


小智 10

如果您执行attach(data)多次,例如5次,那么您可以看到(借助于search())您的数据已在工作空间环境中连接了5次.因此,如果你去掉(detach(data))它一次,data在环境中仍然会有4次.因此,with()/within()是更好的选择.它们有助于创建包含该对象的本地环境,您可以使用它而不会产生任何混淆.