函数参数的部分匹配

ags*_*udy 21 r semantics

我知道,对于一个列表,使用基本运营商建立索引时,部分匹配完成$和[[.例如:

ll <- list(yy=1)
ll$y
[1] 1
Run Code Online (Sandbox Code Playgroud)

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

h <- function(xx=2)xx
h(x=2)
[1] 2
Run Code Online (Sandbox Code Playgroud)

我想了解这是如何工作的.它背后的机制是什么?这有副作用吗?我想知道如果给出了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
Run Code Online (Sandbox Code Playgroud)

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

Ric*_*ton 18

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

两个常见的好用途是:

  1. len代替length.out与seq(或seq.int)功能.

  2. all而不是all.names与ls功能.

相比:

seq.int(0, 1, len = 11) 
seq.int(0, 1, length.out = 11)

ls(all = TRUE)
ls(all.names = TRUE)
Run Code Online (Sandbox Code Playgroud)

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

保存输入的更好解决方案是使用缩写名称,而不是使用缩写名称来自动完成变量和参数名称.R GUI和RStudio使用TAB密钥支持这个,而Architect使用CTRL+ 支持这个Space.

  • 对此设计决定的一般评论./ facepalm在这个部分匹配的参数名称的功能,这可能导致调试头痛无缘无故.1.如果cbb键入长参数名称,那么首先不要将它们命名为long?2. tab-autocompletion FTW! (5认同)
  • 6.5 年后,这仍然导致调试头痛 (3认同)