除了部分匹配之外,$ 运算符可以做 [ 和 [[ 不能做的任何事情吗?

问题描述

我相信 $ 运算符的以下内容是正确的:

  • 它允许部分匹配名称。例如,如果没有使用 data$Sky 名称data$Skywalker 可以匹配 Sky
  • [[[ 不同,它不能用于原子向量。
  • 它不能与 - 之类的运算符结合使用。没有像 mtcars$-mpg 这样的有效语法。 [[[ 也不能对名称执行此操作,但 mtcars[,-1] 可以。
  • 它仅适用于名称
  • 抛开部分匹配不谈,对于一个数据框,data$name 等价于 data[,"name"] 例如mtcars$cylmtcars[,"cyl"] 相同。我很确定 data[["name"]] 也是等价的,例如mtcars[["cyl"]]
  • 除了部分匹配之外,对于不是数据框的命名列表,data$namedata[["name"]] 相同。

这是否意味着如果我不关心部分匹配,我总是可以用$[替换[[?还是我遗漏了某些功能

解决方法

对于基数 R,我最好的猜测来自 the documentation for $。以下引用是最相关的:

$ 仅对递归对象有效

$ 不允许计算索引,而 [[ 允许。 x$name 等价于 x[["name",exact = FALSE]]。此外,可以使用精确参数控制 [[ 的部分匹配行为。

默认行为是仅在通过 $ 从递归对象(环境除外)中提取时才使用部分匹配。即使在这种情况下,也可以通过选项打开警告(warnPartialMatchDollar = TRUE)。

所以文档似乎证实了我的信念,除了部分匹配之外,$ 只是语法糖。但是,有四点我不确定:

  1. 我从不相信 R 的文档。正因为如此,我相信有经验的用户会发现我所说的内容有漏洞。
  2. 我说这只是我对基本 R 的猜测,因为 $ 是一个泛型运算符,因此它的含义可以被包改变,tibble 是一个常见的例子。
  3. $[ 也可用于环境,但我从未见过有人这样做。
  4. 我不知道什么是“计算指数”。
,

根据一本关于​​高级 R 的书,除了部分匹配之外,$ 和 [ 运算符在数据帧上(不是在列表上)是相同的。它指出

$ 是一个简写操作符:x$y 大致相当于 x[["y"]]。 ... $ 和 [[ 之间的一个重要区别是 $ 确实 (从左到右)部分匹配:

这是引用:下一个链接的第 4.3.2 节: https://adv-r.hadley.nz/subsetting.html#section-1

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...