部分匹配,其中$
运算符使用,如果它可以唯一标识给定词干的变量,则将返回一个值(例如 -mail
) 你提供。
例如。 - 没有其他东西开始mail
在你的data.frame
,所以你得到mail_a
回。
u["mail"]
但会抛出错误。
举一个进一步的例子来展示它在哪里像你想象的那样工作:
test <- data.frame(aa=1:10,aaa=letters[1:10])
> test$aa
[1] 1 2 3 4 5 6 7 8 9 10
> test$aaa
[1] a b c d e f g h i j
Levels: a b c d e f g h i j
> test$a
NULL
And fortune(312)
@mnel 指的是:
“这里的问题是 $ 符号是一个神奇的快捷方式,就像
任何其他魔法如果使用不当都可能会导致程序化
相当于把自己变成了一只蟾蜍。”
- Greg Snow(响应一位想要访问其专栏的用户
名称通过 x$y 而不是 x[[y]] 存储在 y 中)
R-帮助(2012 年 2 月)
的一些相关部分R语言定义 https://cran.r-project.org/doc/manuals/r-devel/R-lang.html:
3.4.1 通过向量索引 https://cran.r-project.org/doc/manuals/r-devel/R-lang.html#Indexing-by-vectors
...假设表达式是x[i]
。那么根据类型,存在以下可能性i
特点。中的字符串i
与名称属性相匹配x
并使用所得的整数。为了[[
and $
如果精确匹配失败,则使用部分匹配,因此x$aa
将匹配x$aabb
if x
不包含名为的组件"aa"
and "aabb"
是唯一有前缀的名称"aa"
. For [[
,部分匹配可以通过控制exact
参数默认为NA
指示允许部分匹配,但发生时应产生警告。环境exact
to TRUE
防止发生部分匹配,FALSE
value 允许并且不会发出任何警告。注意[
总是需要完全匹配。字符串""
被特殊对待:它表示“无名称”并且不匹配任何元素(甚至不匹配那些没有名称的元素)。请注意,部分匹配仅在提取时使用,而在替换时不使用。
[也可以看看?Extract
]
4.3.2 参数匹配 https://cran.r-project.org/doc/manuals/r-devel/R-lang.html#Argument-matching
函数求值中发生的第一件事是将形式参数与实际或提供的参数进行匹配。这是通过三遍过程完成的:
-
标签精确匹配。对于每个提供的命名参数,都会在形式参数列表中搜索名称完全匹配的项。让同一个形式论证与多个实际参数相匹配是错误的,反之亦然。
-
标签部分匹配。使用部分匹配将每个剩余的命名提供的参数与剩余的形式参数进行比较。如果提供的参数名称与形式参数的第一部分完全匹配,则认为这两个参数是匹配的。存在多个部分匹配是错误的。请注意,如果f <- function(fumble, fooey) fbody
, then f(f = 1, fo = 2)
是非法的,即使第二个实际参数只匹配fooey
. f(f = 1, fooey = 2)
但这是合法的,因为第二个参数完全匹配,并且从部分匹配的考虑中删除。如果正式参数包含...
那么部分匹配仅适用于其前面的参数。
-
位置匹配.
请注意,当子集atibble https://tibble.tidyverse.org/reference/subsetting.html
列名部分匹配$
and [[
不支持,并且NULL
被返回。为了$
,给出警告。