22

我知道对于列表,在使用基本运算符$[[. 例如:

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

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

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

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

在安德烈评论后编辑:

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匹配背后的基本思想是什么?

4

1 回答 1

22

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

两种常见的良好用途是:

  1. len而不是length.out使用seq(or seq.int) 函数。

  2. allall.names而不是ls函数。

相比:

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

于 2013-01-04T10:23:26.540 回答