为了账号安全,请及时绑定邮箱和手机立即绑定

为什么`[`比‘子集’好‘?

为什么`[`比‘子集’好‘?

收到一只叮咚 2019-06-03 10:26:43
为什么`[`比‘子集’好‘?当我需要过滤data.framework,即提取符合特定条件的行时,我更喜欢使用subset职能:subset(airquality, Month == 8 & Temp > 90)而不是[职能:airquality[airquality$Month == 8 & airquality$Temp > 90, ]我喜欢的主要原因有两个:我发现代码从左到右读得更好。即使对R一无所知的人也能知道subset上面的声明正在做。因为列可以在select表情,我可以保存一些击键。在上面的例子中,我只需键入airquality一次subset,但是有三次[.所以我过着幸福的生活subset到处都是,因为它更短,读得更好,甚至向我的R程序员们宣传它的美丽。但昨天我的世界崩溃了。在阅读subset文档,我注意到本节:警告这是一个便于交互使用的功能。对于编程来说,最好使用[这样的标准子集设置函数,特别是参数子集的非标准计算可能会产生意想不到的后果。有人能帮我澄清作者的意思吗?首先,他们所说的“供交互使用“?我知道什么是交互式会话,而不是以批处理模式运行的脚本,但我不认为它会产生什么不同。那么,请你解释一下“参数子集的非标准求值“为什么它是危险的,也许可以举个例子?”
查看完整描述

2 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

这是一个有点长的阅读,所以在这里记录下Hadley使用的最直接地解决“什么会出错?”的例子可能是有帮助的:

Hadley建议如下示例:假设我们想要子集,然后使用以下函数重新排序数据帧:

scramble <- function(x) x[sample(nrow(x)), ]subscramble <- function(x, condition) {
  scramble(subset(x, condition))}subscramble(mtcars, cyl == 4)

这将返回错误:

val中的错误(Exr,Invir,Ends):找不到对象“cyl”

因为R不再“知道”在哪里找到名为‘cyl’的对象。他还指出,如果在全球环境中偶然有一个叫做“cyl”的物体,那么可能会发生一些真正奇怪的事情:

cyl <- 4subscramble(mtcars, cyl == 4)cyl <- sample(10, 100, rep = T)subscramble(mtcars, cyl == 4)

(你自己跑吧,这太疯狂了。)


查看完整回答
反对 回复 2019-06-03
?
POPMUISE

TA贡献1765条经验 获得超5个赞

[更快:

require(microbenchmark)        microbenchmark(subset(airquality, Month == 8 & Temp > 90),airquality[airquality$Month == 8 & airquality$Temp
 > 90,])
    Unit: microseconds
                                                           expr     min       lq   median       uq    
                                                            max neval
                     subset(airquality, Month == 8 & Temp > 90) 301.994 312.1565 317.3600 349.4170 500.903   100
     airquality[airquality$Month == 8 & airquality$Temp > 90, ] 234.807 239.3125 244.2715 271.7885 340.058   100


查看完整回答
反对 回复 2019-06-03
  • 2 回答
  • 0 关注
  • 592 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信