为什么`[`比‘子集’好‘?当我需要过滤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)
(你自己跑吧,这太疯狂了。)
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
- 2 回答
- 0 关注
- 624 浏览
添加回答
举报
0/150
提交
取消