为什么R使用部分匹配?

为什么R使用部分匹配?,r,semantics,R,Semantics,我知道,对于列表,使用基本运算符$和[[编制索引时会进行部分匹配。例如: ll <- list(yy=1) ll$y [1] 1 但是为什么R有这样的功能呢?部分唯一匹配背后的基本思想是什么?部分匹配的存在是为了避免您键入长参数名称。它的危险在于,函数以后可能会获得与部分匹配冲突的额外参数。这意味着它只适合交互式使用-如果您编写的代码会持续很长时间(例如,放入包中),那么您应该始终编写完整的参数名。另一个问题是,通过缩写参数名,您可以降低代码的可读性 两种常见的良好用途是: len而不是

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

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

但是为什么R有这样的功能呢?
部分唯一
匹配背后的基本思想是什么?

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

两种常见的良好用途是:

  • len
    而不是
    length.out
    ,具有(或
    seq.int
    )功能

  • all
    而不是带有该函数的
    all.names

  • 比较:

    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。

    Read@Andrie感谢您的链接!即使它没有解释R为什么有此功能,我也会接受它作为答案。It看起来像是其他功能的副作用,因为有多个部分匹配是错误的。下面是对“原因”的猜测。R被设计为一种命令行统计语言。一种快速简便的数据分析方法。部分匹配使命令行分析更容易(但编程更麻烦)。使用
    [[
    默认情况下不会作为参数
    exact=TRUE
    执行部分匹配。我甚至在
    ls
    中使用
    a=T
    。有时,如果您知道arg名称,您就可以不必担心此设计决策的一般性意见。/facepalm了解部分匹配参数名称的功能,这可能会导致调试问题原因。1.如果cbb要输入长参数名称,那么一开始就不要将它们命名为长参数?2.tab autocompletion FTW!5年后评论:FWIW我很确定R的早期版本没有进行tab autocompletion。而S(我认为这项功能的基础)几乎肯定没有。
     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
    
    seq.int(0, 1, len = 11) 
    seq.int(0, 1, length.out = 11)
    
    ls(all = TRUE)
    ls(all.names = TRUE)