2013-01-04 102 views
19

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

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

+3

阅读http://cran.r-project.org/doc/manuals/R-lang.html#Argument-matching – Andrie

+1

@Andrie感谢您的联系!我会接受它作为答案,即使它不能解释为什么R有这个功能?它看起来像其他功能的副作用,因为有多个部分匹配是错误的。 – agstudy

+3

这是对“为什么”的猜测。 R被设计成一个命令行统计语言。一种快速简单的数据分析方法。部分匹配可以使命令行分析更容易(但编程更加复杂)。 – csgillespie

回答

17

部分匹配的存在是为了节省您输入长参数名称的时间。其危险之处在于函数稍后会获得更多的参数,与您的部分匹配相冲突。这意味着它只适用于交互式使用–,如果您正在编写将长期存在的代码(例如进入一个包),那么您应该始终写出完整的参数名称。另一个问题是通过缩写参数名称,可以使您的代码不易读。

两个公共利益的用途是:

  1. len代替length.outseq(或seq.int)功能。

  2. 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 + 空间

+1

我甚至在'ls'中使用'a = T'。有时,如果您知道参数名称 –

+2

对此设计决策的一般评论,您可以避开它。 /facepalm在这个功能部分匹配的参数名称,可以导致无故的调试头痛。 1.如果cbb键入较长的参数名称,那么不要首先将它们命名为long? 2. tab-autocompletion FTW! –