f=function(s,abc=0,def=0) {
return(s+def)
}
f(3)
[1] 3
f(3,d=4)
[1] 7
为什么R将“d”与“def”匹配?
是否有规则说明在函数中找不到变量的名称时,R会自动匹配大写字母与其相同的名称?
答案 0 :(得分:6)
参数匹配有三种主要方法。这些内容在Argument Matching的R Language Definition部分进行了讨论,我在下面的相关部分中重复了这些部分:
功能评估中首先发生的是匹配 正式的实际或提供的论点。这是由a完成的 三通过程:
- 标签上的完全匹配。对于每个命名的提供参数,将搜索形式参数列表以查找名称匹配的项目 究竟。使相同的形式参数匹配几个是错误的 实际情况,反之亦然。
- 标签上的部分匹配。使用部分匹配将每个剩余的命名提供参数与剩余的正式参数进行比较。 如果提供的参数的名称与第一个完全匹配 这是正式论证的一部分,这两个论点被认为是 匹配。具有多个部分匹配是错误的。请注意 如果
f <- function(fumble, fooey) fbody
,那么f(f = 1, fo = 2)
就是 即使第二个实际参数仅与fooey
匹配,也是非法的。 自第二个论点以来,f(f = 1, fooey = 2)
是合法的 完全匹配,并从部分考虑中删除 匹配。如果形式参数包含...
,那么部分匹配 仅适用于其前面的参数。- 位置匹配。任何不匹配的形式参数都按顺序绑定到未命名的提供参数。如果存在
醇>...
参数,则为 将接受剩余的参数,标记与否。
请注意,正常功能会发生这种情况。 Primitve函数在R中是特殊的。原语在很多方面都很特殊,并且总是不使用标签,而是使用位置匹配。然而,这并未始终如一地应用。
另一个重要的例外是包含...
参数的函数中的参数。如上所述,如果参数在函数的参数列表中 ...
后出现,则必须在调用该函数时将该参数命名为 if 作为位置匹配不适用于这些参数。例如:
foo <- function(x, ..., y) {
y
}
将值传递给y
的唯一方法是在函数调用中命名它,例如:
foo(y = 1)
答案 1 :(得分:5)
这在R语言定义的Argument Matching部分中有所描述。
本小节适用于闭包但不适用于原始函数。 后者通常忽略标签并进行位置匹配,但它们的位置匹配 有关例外的咨询页面应参考,包括日志, round,signif,rep和seq.int。
功能评估中首先发生的是匹配 正式的实际或提供的论点。这是由a完成的 三通过程:
标签上的精确匹配。对于每个命名提供的参数列表 搜索形式参数以查找名称完全匹配的项目。 使相同的形式参数匹配几个实际值是错误的 或相反亦然。
标签上的部分匹配。每个剩下的名字 提供的参数与剩余的正式参数进行比较 部分匹配。如果提供的参数的名称完全匹配 在正式论证的第一部分,然后两个论点是 被认为是匹配的。有多个部分是错误的 火柴。请注意,如果
f <- function(fumble, fooey) fbody
,则f(f = 1, fo = 2)
是非法的,即使仅是第二个实际参数 匹配fooey
。f(f = 1, fooey = 2)
从第二个开始就是合法的 参数完全匹配,并从部分考虑中删除 匹配。如果形式参数包含'...',那么部分匹配 仅适用于它之前的参数。位置匹配。任何不匹配的形式参数都绑定到未命名的提供 参数,按顺序。如果有一个'...'参数,它将占用 剩下的参数,是否有标记。