我最近读了R语言定义的这一部分,感到非常困惑。上面写着:
对于向量和矩阵,
[[
形式很少使用,尽管它们与[
形式有一些轻微的语义差异(例如,它删除了任何名称或dimnames属性,并且部分匹配用于字符索引(。
我是不是看错了?似乎可以说[[
允许命名向量和矩阵的部分匹配(可能是默认情况下(。然而,我知道这显然是错误的:
> lett<-setNames(sample(26),paste0(letters,letters,letters))
> lett[["aaa"]]#No partial match
[1] 23
> lett[["a"]]#Error
Error in lett[["a"]] : subscript out of bounds
那么,语言定义是什么意思呢?它可能是关于您可以设置的exact=FALSE
标志,但这似乎是一种非常奇怪的方式。事实上,后面的部分提出了以下主张,我上面的代码反驳了这一点,所以我更困惑:
对于
[[
和$
,如果精确匹配失败,则使用部分匹配,因此如果x
不包含名为"0"的组件,则x$aa
将匹配x$aabb
;aa";以及";aabb";是唯一具有前缀"的名称;aa";。对于[[
,可以通过精确参数控制部分匹配,该参数默认为NA
,表示允许部分匹配,但发生时应发出警告。
语言定义只是过时了吗?
实际上,我认为语言定义——至少部分——确实过时了。help("[[")
关于exact
自变量的帮助页面显示
通过字符向量提取时控制[[的可能部分匹配[…]。默认为无部分匹配。值NA允许部分匹配,但发生时会发出警告。值FALSE允许在没有任何警告的情况下进行部分匹配。
用法支持此声明:
x[[i, exact = TRUE]]
x[[i, j, ..., exact = TRUE]]
下面的代码也证明了这些默认值。
set.seed(1)
lsub <- letters[1:3]
lett <- setNames(lapply(sample(3), c), paste0(lsub, lsub, lsub))
lett
#> $aaa
#> [1] 1
#>
#> $bbb
#> [1] 3
#>
#> $ccc
#> [1] 2
# partial matching
lett$a
#> [1] 1
lett[["aa", exact = FALSE]]
#> [1] 1
# no partial matching
lett[["aa"]]
#> NULL
# partial matching with warning
lett[["aa", exact = NA]]
#> Warning in lett[["aa", exact = NA]]: partial match of 'aa' to 'aaa'
#> [1] 1