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

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

当我需要过滤data.framework,即提取符合特定条件的行时,我更喜欢使用subset职能:

subset(airquality, Month == 8 & Temp > 90)

而不是[职能:

airquality[airquality$Month == 8 & airquality$Temp > 90, ]

我喜欢的主要原因有两个:

  1. 我发现代码从左到右读得更好。即使对R一无所知的人也能知道subset上面的声明正在做。

  2. 因为列可以在select表情,我可以保存一些击键。在上面的例子中,我只需键入airquality一次subset,但是有三次[.

所以我过着幸福的生活subset到处都是,因为它更短,读得更好,甚至向我的R程序员们宣传它的美丽。但昨天我的世界崩溃了。在阅读subset文档,我注意到本节:

警告

这是一个便于交互使用的功能。对于编程来说,最好使用[这样的标准子集设置函数,特别是参数子集的非标准计算可能会产生意想不到的后果。

有人能帮我澄清作者的意思吗?

首先,他们所说的“供交互使用“?我知道什么是交互式会话,而不是以批处理模式运行的脚本,但我不认为它会产生什么不同。

那么,请你解释一下“参数子集的非标准求值“为什么它是危险的,也许可以举个例子?”


收到一只叮咚
浏览 625回答 2
2回答

慕姐4208626

这是一个有点长的阅读,所以在这里记录下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)(你自己跑吧,这太疯狂了。)

POPMUISE

也[更快:require(microbenchmark)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;microbenchmark(subset(airquality,&nbsp;Month&nbsp;==&nbsp;8&nbsp;&&nbsp;Temp&nbsp;>&nbsp;90),airquality[airquality$Month&nbsp;==&nbsp;8&nbsp;&&nbsp;airquality$Temp &nbsp;>&nbsp;90,]) &nbsp;&nbsp;&nbsp;&nbsp;Unit:&nbsp;microseconds &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;expr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;min&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lq&nbsp;&nbsp;&nbsp;median&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uq&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max&nbsp;neval &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;subset(airquality,&nbsp;Month&nbsp;==&nbsp;8&nbsp;&&nbsp;Temp&nbsp;>&nbsp;90)&nbsp;301.994&nbsp;312.1565&nbsp;317.3600&nbsp;349.4170&nbsp;500.903&nbsp;&nbsp;&nbsp;100 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;airquality[airquality$Month&nbsp;==&nbsp;8&nbsp;&&nbsp;airquality$Temp&nbsp;>&nbsp;90,&nbsp;]&nbsp;234.807&nbsp;239.3125&nbsp;244.2715&nbsp;271.7885&nbsp;340.058&nbsp;&nbsp;&nbsp;100
打开App,查看更多内容
随时随地看视频慕课网APP