R 对于命名向量和矩阵,[[是否使用过部分匹配而不传递exact=FALSE参数?

R 对于命名向量和矩阵,[[是否使用过部分匹配而不传递exact=FALSE参数?,r,subset,names,R,Subset,Names,我最近读了一本书,感到非常困惑。上面写着: 对于向量和矩阵,[表单很少使用,尽管它们与[表单有一些细微的语义差异(例如,它会删除任何名称或dimnames属性,并且部分匹配用于字符索引) 我误读了吗?似乎是说[[允许命名向量和矩阵的部分匹配(可能是默认情况下)。但是,我知道这显然是错误的: > lett<-setNames(sample(26),paste0(letters,letters,letters)) > lett[["aaa"]]#No parti

我最近读了一本书,感到非常困惑。上面写着:

对于向量和矩阵,
[
表单很少使用,尽管它们与
[
表单有一些细微的语义差异(例如,它会删除任何名称或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
>莱特[[“aaa”].#没有部分匹配
[1] 23
>lett[[“a”]#错误
lett[[“a”]]中出错:下标超出范围
那么语言定义是什么意思呢?它可能是指你可以设置的
exact=FALSE
标志,但这似乎是一种非常奇怪的方式。事实上,我提出了以下声明,上面的代码反驳了这一点,所以我更困惑了:

对于
[[
$
而言,如果精确匹配失败,则使用部分匹配,因此
x$aa
将匹配
x$aabb
如果
x
不包含名为“aa”的组件,并且“aabb”是唯一具有前缀“aa”的名称。对于
[[
,部分匹配可以通过精确的参数进行控制,该参数默认为
NA
,表示允许进行部分匹配,但发生时会导致警告


语言定义已经过时了吗?

事实上,我认为语言定义至少部分已经过时了。
help(“[[”
的帮助页面中关于
确切的
参数的说明

控制[[当通过字符向量[…]提取时]的可能部分匹配。默认值为“无部分匹配”。值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
set.seed(1)
lsub[1]1
#> 
#>bbb美元
#> [1] 3
#> 
#>$ccc
#> [1] 2
#部分匹配
一美元
#> [1] 1
lett[[“aa”,精确=假]]
#> [1] 1
#没有部分匹配
莱特[[“aa”]]
#>空的
#带有警告的部分匹配
lett[[“aa”,精确=NA]]
#>lett[[“aa”,exact=NA]]中的警告:“aa”与“aaa”部分匹配
#> [1] 1

默认用法是
x[[i,exact=TRUE]]
。因此,您可能需要更改
exact=FALSE
以返回值
lett[[a',exact=FALSE]].[1]25
@akrun查看我的最新编辑。我完全相信您,但语言定义似乎不一致?