您是使用attach()还是通过名称或切片调用变量?

kpi*_*ce8 26 coding-style r

许多介绍R书和指南都是从附加a的练习开始的,data.frame这样你就可以通过名字来调用变量.我总是发现用$符号或方括号切片调用变量是有利的[,2].这样我可以使用多个data.frames而不会混淆它们和/或使用迭代来连续调用感兴趣的列.我注意到Google最近公布了R的编码指南,其中包括该行

1)附:避免使用它

人们如何看待这种做法?

Edu*_*oni 25

我从不使用附件.with并且within是你的朋友.

示例代码:

> N <- 3
> df <- data.frame(x1=rnorm(N),x2=runif(N))
> df$y <- with(df,{
   x1+x2
 })
> df
          x1         x2          y
1 -0.8943125 0.24298534 -0.6513271
2 -0.9384312 0.01460008 -0.9238312
3 -0.7159518 0.34618060 -0.3697712
> 
> df <- within(df,{
   x1.sq <- x1^2
   x2.sq <- x2^2
   y <- x1.sq+x2.sq
   x1 <- x2 <- NULL
 })
> df
          y        x2.sq     x1.sq
1 0.8588367 0.0590418774 0.7997948
2 0.8808663 0.0002131623 0.8806532
3 0.6324280 0.1198410071 0.5125870
Run Code Online (Sandbox Code Playgroud)

编辑:hadley在评论中提到变换.这是一些代码:

 > transform(df, xtot=x1.sq+x2.sq, y=NULL)
       x2.sq       x1.sq       xtot
1 0.41557079 0.021393571 0.43696436
2 0.57716487 0.266325959 0.84349083
3 0.04935442 0.004226069 0.05358049
Run Code Online (Sandbox Code Playgroud)

  • `transform`是内部的另一个有用变体. (3认同)

Dir*_*tel 13

我更喜欢用来with获得attach单个命令的等价物:

 with(someDataFrame,  someFunction(...))
Run Code Online (Sandbox Code Playgroud)

这也自然导致subset了第一个参数的形式:

 with(subset(someDataFrame,  someVar > someValue),
      someFunction(...))
Run Code Online (Sandbox Code Playgroud)

这清楚地表明我们对选择的数据进行操作.虽然许多建模函数都有datasubset参数,但上面的使用更加一致,因为它也适用于那些没有 datasubset参数的函数.


Thi*_*rry 8

附加的主要问题是它可能导致不必要的行为.假设您的工作区中有一个名为xyz的对象.现在您附加了具有名为xyz的列的数据框abc.如果你的代码引用xyz,你能保证是对对象或dataframe列的引用吗?如果你不使用附件那么很容易.只是xyz指的是对象.abc $ xyz指的是数据帧的列.

在教科书中经常使用附加的一个主要原因是它缩短了代码.


Far*_*rel 7

"依附"是一种邪恶的诱惑.在那里它运作良好,唯一的地方是在课堂上,其中一个被赋予一个单一的数据帧,预计写的代码行做了分析上一个数据帧.一旦完成分配并交付,用户就不可能再次使用该数据.

但是,在现实世界中,可以将更多数据帧添加到特定项目中的数据集合中.此外,通常会复制和粘贴代码块以用于类似的东西.通常一个人是从几个月前做过的东西借来的,并且不记得从哪里调用的东西的细微差别.在这种情况下,人们会因先前使用"附加"而溺水身亡.