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