r-对于命名向量和矩阵,[[是否在不传递精确=FALSE参数的情况下使用部分匹配



我最近读了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

相关内容

最新更新