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 )
尝试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参数是固定的,只需将其从函数的参数中取出即可。为了避免输入预先分配的参数,如果发现无效的参数名称,您可以引发错误。