当我需要过滤数据时.frame,即提取满足特定条件的行,我更喜欢使用subset函数:

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

而不是[功能:

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

我的偏好主要有两个原因:

  1. 我发现代码从左到右读起来更好.即使对R一无所知的人也能知道上面的subset条语句在做什么.

  2. 因为列在select表达式中可以被称为变量,所以我可以节省一些按键.在我上面的例子中,我只需要用subset输入airquality一次,但用[输入三次.

所以我过着幸福的生活,到处都用subset,因为它更短,读起来更好,甚至向我的程序员同事宣扬它的美丽.但昨天我的世界崩溃了.在阅读subset篇文档时,我注意到这一部分:

警告

这是一个便于交互使用的功能.对于编程来说,最好使用标准的子集函数,比如[,尤其是参数子集的非标准求值可能会产生意想不到的后果.

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

首先,他们所说的"for use interactively"是什么意思?我知道什么是交互式会话,而不是在批处理模式下运行脚本,但我不知道它应该有什么区别.

那么,请你解释一下"the non-standard evaluation of argument subset"这个词,以及为什么它很危险,也许可以举个例子?

推荐答案

这个问题在@James的 comments 中得到了很好的回答,他指出了哈德利·威克姆对subset(以及类似的功能) [here]的危险性的极好解释.go 读吧!

这本书读得有点长,所以在这里记录哈德利使用的最直接解决"什么可能出错"问题的例子可能会有所帮助:

Hadley给出了以下示例:假设我们希望使用以下函数对数据帧进行子集,然后重新排序:

scramble <- function(x) x[sample(nrow(x)), ]

subscramble <- function(x, condition) {
  scramble(subset(x, condition))
}

subscramble(mtcars, cyl == 4)

这将返回错误:

eval(expr、envir、enclose)中出错:找不到对象"cyl"

因为R不再"知道"在哪里找到叫做"cyl"的物体.他还指出,如果全球环境中碰巧有一个叫做"共青团"的物体,就会发生真正奇怪的事情:

cyl <- 4
subscramble(mtcars, cyl == 4)

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

(为了他们,你自己看看吧.)

R相关问答推荐

将coord_sf与geom_spatraster一起使用会更改分辨率

用apply/map/etch替换循环以加快速度

R -创建一列,指示另一列是否具有相同的值

如何将具有重复名称的收件箱合并到R中的另一列中,而结果不同?

根据shiny 应用程序中的数字输入更改图标 colored颜色

管道末端运行功能

多重RHS固定估计

在数学中正确显示摄氏度、开氏度或华氏度

从BRM预测价值

多个过滤器内的一个盒子在仪表板Quarto

有没有办法使用ggText,<;Sub>;&;<;sup>;将上标和下标添加到同一元素?

当我添加美学时,geom_point未对齐

如何移除GGPlot中超出与面相交的任何格网像元

如何对r中包含特定(未知)文本的行求和?

我如何使用tidyselect来传递一个符号数组,比如Pivot_Long?

在R中,如何从一系列具有索引名的变量快速创建数据帧?

使用来自嵌套列和非嵌套列的输入的PURRR:MAP和dplyr::Mariate

计算来自单独分组的分幅的值的百分位数

按镜像列值自定义行顺序

GOGPLATE geom_boxploy色彩疯狂