问题描述
我相信 $
运算符的以下内容是正确的:
- 它允许部分匹配名称。例如,如果没有使用
data$Sky
名称,data$Skywalker
可以匹配Sky
。 - 与
[
和[[
不同,它不能用于原子向量。 - 它不能与
-
之类的运算符结合使用。没有像mtcars$-mpg
这样的有效语法。[
和[[
也不能对名称执行此操作,但mtcars[,-1]
可以。 - 它仅适用于名称。
- 抛开部分匹配不谈,对于一个数据框,
data$name
等价于data[,"name"]
例如mtcars$cyl
与mtcars[,"cyl"]
相同。我很确定data[["name"]]
也是等价的,例如mtcars[["cyl"]]
。 - 除了部分匹配之外,对于不是数据框的命名列表,
data$name
与data[["name"]]
相同。
这是否意味着如果我不关心部分匹配,我总是可以用$
或[
替换[[
?还是我遗漏了某些功能?
解决方法
对于基数 R,我最好的猜测来自 the documentation for $。以下引用是最相关的:
$ 仅对递归对象有效
$ 不允许计算索引,而 [[ 允许。 x$name
等价于 x[["name",exact = FALSE]]
。此外,可以使用精确参数控制 [[
的部分匹配行为。
默认行为是仅在通过 $ 从递归对象(环境除外)中提取时才使用部分匹配。即使在这种情况下,也可以通过选项打开警告(warnPartialMatchDollar = TRUE)。
所以文档似乎证实了我的信念,除了部分匹配之外,$
只是语法糖。但是,有四点我不确定:
- 我从不相信 R 的文档。正因为如此,我相信有经验的用户会发现我所说的内容有漏洞。
- 我说这只是我对基本 R 的猜测,因为
$
是一个泛型运算符,因此它的含义可以被包改变,tibble 是一个常见的例子。 -
$
和[
也可用于环境,但我从未见过有人这样做。 - 我不知道什么是“计算指数”。
根据一本关于高级 R 的书,除了部分匹配之外,$ 和 [ 运算符在数据帧上(不是在列表上)是相同的。它指出
$ 是一个简写操作符:x$y 大致相当于 x[["y"]]。 ... $ 和 [[ 之间的一个重要区别是 $ 确实 (从左到右)部分匹配:
这是引用:下一个链接的第 4.3.2 节: https://adv-r.hadley.nz/subsetting.html#section-1