函数参数的部分匹配

时间:2013-01-04 08:53:18

标签: r semantics

我知道对于列表,使用基本运算符$[[进行索引时会进行部分匹配。例如:

ll <- list(yy=1)
ll$y
[1] 1

但我仍然是R新手,这对我来说是新的,功能参数的部分匹配:

h <- function(xx=2)xx
h(x=2)
[1] 2

我想了解这是如何运作的。它背后的机制是什么?这有副作用吗?我想了解如果有人测试是否给出了xx参数?

Andrie评论后编辑:

内部R使用pmatch算法来匹配参数,这里有一个例子:

 pmatch("me",   c("mean", "median", "mode")) # error multiple partial matches
[1] NA
> pmatch("mo",   c("mean", "median", "mode")) # mo match mode match here
[1] 3

但为什么R有这样的功能? partial unique匹配背后的基本理念是什么?

1 个答案:

答案 0 :(得分:18)

存在部分匹配以保存您输入长参数名称。它的危险在于函数可能会在以后与您的部分匹配发生冲突时获得额外的参数。这意味着它仅适用于交互式使用 - 如果您编写的代码会长时间存在(例如,进入包中),那么您应该始终编写完整的参数名称。另一个问题是,通过缩写参数名称,可以降低代码的可读性。

两个常见的好用途是:

    使用seq(或len)函数
  1. length.out代替seq.int

  2. 使用ls功能
  3. all而不是all.names

  4. 比较

    seq.int(0, 1, len = 11) 
    seq.int(0, 1, length.out = 11)
    
    ls(all = TRUE)
    ls(all.names = TRUE)
    

    在这两种情况下,代码与缩短的参数名称一样容易阅读,并且函数很旧且足够稳定,因此不太可能添加具有冲突名称的另一个参数。

    更好的解决方案是节省输入,而不是使用缩写名称来使用变量和参数名称的自动完成。 R GUI和RStudio使用 TAB 键支持此功能,而Architect使用 CTRL + Space 支持此功能。