如何解决对于命名向量和矩阵, [[ 是否曾经使用部分匹配而不传递精确 = FALSE 参数?
我最近阅读了 this section of the R Language Definition 并且变得非常困惑。它说:
对于向量和矩阵,[[
形式很少使用,尽管它们与 [
形式有一些细微的语义差异(例如它删除任何名称或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
标志,但这似乎是一种非常奇怪的方法。事实上,a later section 提出了以下声明,我上面的代码反驳了这一说法,所以我更加困惑:
对于[[
和$
,如果完全匹配失败,则使用部分匹配,因此如果x$aa
不包含名为“的组件”,x$aabb
将匹配x
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。