为啥 R 使用部分匹配?

Posted

技术标签:

【中文标题】为啥 R 使用部分匹配?【英文标题】:Why does R use partial matching?为什么 R 使用部分匹配? 【发布时间】:2012-12-18 16:48:38 【问题描述】:

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

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

【问题讨论】:

阅读cran.r-project.org/doc/manuals/R-lang.html#Argument-matching @Andrie 感谢您的链接!即使它没有解释为什么 R 具有此功能,我也会接受它作为答案?它看起来像是其他功能的副作用,因为有多个部分匹配是错误的。 这是对“为什么”的猜测。 R 被设计为一种命令行统计语言。一种快速简便的数据分析方法。部分匹配使命令行分析更容易(但编程更麻烦)。 使用[[ 的索引默认不会作为参数exact = TRUE 执行部分匹配。 【参考方案1】:

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

两种常见的用途是:

    len 代替 length.outseq(或 seq.int)函数。

    all 代替 all.namesls 函数。

比较:

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 支持这一点。

【讨论】:

我什至在ls 中使用a=T。如果你知道 arg 名称,有时你可以侥幸逃脱 对此设计决策的一般评论。 /facepalm 在此部分匹配参数名称的功能上可能会无缘无故地导致调试头痛。 1. 如果 cbb 键入长参数名称,那么首先不要将它们命名为长名称? 2. tab-autocompletion FTW! 5 年后评论:FWIW 我很确定 R 的早期版本没有做制表符自动补全。而 S(我认为这个特性是基于它的)几乎可以肯定没有。

以上是关于为啥 R 使用部分匹配?的主要内容,如果未能解决你的问题,请参考以下文章

R:使用 for 循环将因子的级别部分匹配到字符串? [复制]

R中的快速部分字符串匹配

正则表达式.+可以匹配空格,但是[.\w]+却不匹配,为啥?

为啥听力下载不了?

在 Shiny 中使用部分 textInput 作为 R 中的变量

为啥 re.sub() 在 Python 中默认添加不匹配的字符串?