许多介绍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)
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)
这清楚地表明我们对选择的数据进行操作.虽然许多建模函数都有data和subset参数,但上面的使用更加一致,因为它也适用于那些没有 data和subset参数的函数.
附加的主要问题是它可能导致不必要的行为.假设您的工作区中有一个名为xyz的对象.现在您附加了具有名为xyz的列的数据框abc.如果你的代码引用xyz,你能保证是对对象或dataframe列的引用吗?如果你不使用附件那么很容易.只是xyz指的是对象.abc $ xyz指的是数据帧的列.
在教科书中经常使用附加的一个主要原因是它缩短了代码.
"依附"是一种邪恶的诱惑.在那里它运作良好,唯一的地方是在课堂上,其中一个被赋予一个单一的数据帧,预计写的代码行做了分析上一个数据帧.一旦完成分配并交付,用户就不可能再次使用该数据.
但是,在现实世界中,可以将更多数据帧添加到特定项目中的数据集合中.此外,通常会复制和粘贴代码块以用于类似的东西.通常一个人是从几个月前做过的东西借来的,并且不记得从哪里调用的东西的细微差别.在这种情况下,人们会因先前使用"附加"而溺水身亡.