3

我遇到了子集函数的一个令人困惑的“功能”(使用列名作为子集的向量名称不起作用):

data(iris)
Species <- unique(iris$Species)
i <- 2
Species[i]
subset(iris, subset = Species == Species[i])

sp <- unique(iris$Species)
sp[i]
subset(iris, subset = Species == sp[i])

有人可以解释一下,这里发生了什么,为什么?

4

1 回答 1

9

subset()将首先在数据框中查看您提到的任何对象,因此在您的第一个示例中Species[i]返回“setosa”(与 相同iris$Species[i])。只有当您指定的对象在数据框中找不到时,R 才会在父帧中查找并在那里找到正确的对象。

所以这一切都有效,你只是不明白它是如何工作的。您可以在帮助文件中阅读此内容:

请注意,将在数据框中评估子集,因此可以(按名称)将列称为表达式中的变量(参见示例)。

这是怎么回事?

原因是以下代码行subset()

e <- substitute(subset)
r <- eval(e, x, parent.frame())
  • subset(或e)在您的示例中Species == Species[i]
  • x在你的例子中iris
  • parent.frame()在您的示例中返回全局环境。

eval调用,的第二个参数x被调用envir。它是评估表达式的环境(或列表或数据框,...)。在您的情况下, R 评估Species == Species[i] inside x,这是您的数据框。

第三个参数parent.frame()是外壳。这是包含您指定的数据框 als 环境的环境,并且是 R 在数据框中找不到变量的情况下将查找的地方。

也可以看看 ?eval

于 2012-05-30T11:55:50.767 回答