R函数中...的奇怪行为

6

如果一个函数有一个参数,并且省略号和两者都以相同的字母开头,我遇到了一种奇怪的行为。 以下是一个简单的例子。

> testfun=function(aa=0, ...) {print(aa); list(...)} 
> testfun(b=1)
[1] 0
$b
[1] 1

> testfun(a=1)
[1] 1
list()

当我调用testfun(b=1)时,一切都正常,打印出aa的值为0,并返回包含元素b=1的列表。然而,如果我调用testfun(a=1),则aa现在为1,返回空列表。很显然,如果有一个参数以与传递给...相同的字母开头,则会更改该参数并且...将被丢失。
知道这是为什么吗?有没有办法避免这种情况? 在我的实际问题中,...由用户提供,他们可能使用任何名称作为参数(除了像这里的aa那样已经是函数的参数)。

1
testfun(a=1) 中的 a 被视为 aa 的缩写。如果您尝试 testfun(aaa = 1),则不会出现这种行为。 - John Coleman
2
强相关:为什么R使用部分匹配? - Gregor Thomas
1
在 R 中,函数的参数是基于位置和部分匹配进行匹配的。就像 @JohnColeman 所提到的那样,在你的例子中,a 部分匹配 aa,但不匹配 aaa - Anoushiravan R
请仅返回翻译后的文本:此外,相关链接:https://dev59.com/-lYM5IYBdhLWcg3wrBjT;https://dev59.com/KWUp5IYBdhLWcg3wdXaa。 - user20650
2个回答

3

正如其他人所提到的,R使用部分参数匹配,因此如果用户输入a,它将与函数中的形式参数aa匹配。但我认为没有人提到过,在省略号后跟随的形式参数中,R使用精确匹配。例如,

testfun <- function(..., aa = 0) {
  print(aa)
  list(...)
} 

testfun(a = 1)
#> [1] 0
#> $a
#> [1] 1

本示例使用 reprex v2.0.2 创建于2022-10-19


1
尝试在函数中分配aa变量:
testfun=function(...){
  if(any("aa" == names(list(...)))) {
    stop("Invalid argument")
  }
  aa = 0
  print(aa) 
  print(names(list(...)))
  print(list(...))
  } 

> testfun(aa = , b=1)
[1] 0
[1] "b"
$b
[1] 1

> testfun(aa = , a = 1)
[1] 0
[1] "a"
$a
[1] 1

> testfun(aa = 1)
Error in testfun(aa = 1) : Invalid argument

这篇文章提到用户只需要输入...部分。由于aa参数是固定的,只需将其从函数参数中取出即可。为了避免输入预先分配的参数,如果发现无效的参数名称,可以引发一个错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接