部分匹配存在的目的是为了节省您键入长参数名称的时间。但它带来的风险是,函数可能会在以后增加与您的部分匹配冲突的额外参数。这意味着它仅适用于交互式使用-如果您正在编写将长时间保留的代码(例如,放入软件包中),则应始终编写完整的参数名称。另一个问题是通过缩写参数名称,可能会使您的代码难以阅读。
两个常见的好用法是:
1. 使用
seq
(或
seq.int
)函数时,使用
len
代替
length.out
。
2. 使用
ls
函数时,使用
all
代替
all.names
。
比较:
seq.int(0, 1, len = 11)
seq.int(0, 1, length.out = 11)
ls(all = TRUE)
ls(all.names = TRUE)
在这两种情况下,使用缩短的参数名称读取代码几乎同样容易,而且这些函数已经存在很长时间,稳定性足够高,不太可能添加具有冲突名称的另一个参数。
为了节省输入,更好的解决方案是使用变量和参数名称的自动完成,而不是使用缩写名称。 R GUI和RStudio使用TAB键支持此功能,Architect使用CTRL+Space支持此功能。
以下是R语言定义中的一些相关部分:
3.4.1 通过向量索引
...假设表达式为x[i]
。根据i
的类型,存在以下可能性:
字符。在
i
中的字符串与
x
的名称属性匹配,并使用结果整数。对于
[[
和
$
,如果精确匹配失败,则使用部分匹配,因此如果
x
不包含名为“aa”的组件且“aabb”是唯一具有前缀“aa”的名称,则
x$aa
将与
x$aabb
匹配。对于
[[
,可以通过默认为
NA
的
exact
参数控制部分匹配,表示允许部分匹配,但在发生时应发出警告。将
exact
设置为
TRUE
可防止发生部分匹配,
FALSE
值允许它并且不发出任何警告。请注意,
[
始终需要精确匹配。字符串
""
被特殊处理:它表示“没有名称”,不匹配任何元素(甚至没有名称的元素)。请注意,在提取而非替换时才使用部分匹配。
[另请参见?Extract
]
4.3.2 参数匹配
函数求值的第一步是将形式参数与实际或提供的参数进行匹配。这是通过三遍过程完成的:
标签的精确匹配。对于每个命名的提供的参数,都会在形式参数列表中搜索名称完全匹配的项。如果同一个形式参数匹配多个实际参数或者反之,则会出现错误。
标签的部分匹配。将剩余的命名提供的参数与剩余的形式参数进行部分匹配。如果提供的参数的名称与形式参数的前半部分完全匹配,则认为这两个参数匹配。有多个部分匹配是错误的。请注意,如果f <- function(fumble, fooey) fbody
,则f(f = 1, fo = 2)
是非法的,即使第二个实际参数只匹配了fooey
。但是f(f = 1, fooey = 2)
是合法的,因为第二个参数完全匹配,并且不再考虑进行部分匹配。如果形式参数包含...
,则部分匹配仅应用于它之前的参数。
位置匹配。
请注意,使用
子集化 tibble
时不支持列名的部分匹配,
$
和
[[
返回
NULL
。对于
$
,会给出警告。
[[
进行索引时,默认情况下不执行部分匹配,因为参数exact = TRUE
。 - Helix123