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

Wol*_*lke 6 r user-defined-functions

如果一个函数有一个参数和椭圆并且两者以相同的字母开头,我会遇到奇怪的行为。一个玩具示例是这个

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

> testfun(a=1)
[1] 1
list()
Run Code Online (Sandbox Code Playgroud)

因此,当我调用时testfun(b=1),一切正常,aa打印为 0 并返回元素 b=1 的列表。但是,如果我调用testfun(a=1),aa 现在为 1 并且返回一个空列表。显然,如果有一个参数以与传递给 ... 的字母相同的字母开头,则该参数会发生更改并且...会丢失。

知道这是为什么吗?有什么办法可以避免这种情况吗?在我真正的问题中,...由用户提供,他们可能使用任何名称作为参数(除了那些已经是函数参数的名称,例如这里的 aa )

Den*_*hen 1

尝试aa在函数中分配变量:

testfun=function(...){
  if(any("aa" == names(list(...)))) {
    stop("Invalid argument")
  }
  aa = 0
  print(aa) 
  print(names(list(...)))
  print(list(...))
  } 
Run Code Online (Sandbox Code Playgroud)
> 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
Run Code Online (Sandbox Code Playgroud)

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