Для именованных векторов и матриц [[ когда-либо использует частичное соответствие без передачи точного = FALSE аргумента?

Я недавно прочитал этот раздел 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, который вы можете установить, но это кажется очень странным способом сделать это. Фактически, более поздний раздел делает следующее утверждение, которое опровергается приведенным выше кодом, так что я еще больше запутался:

Для [[ и $ используется частичное совпадение, если точное совпадение не удается, поэтому x$aa будет соответствовать x$aabb, если x не содержит компонент с именем aa, а aabb — единственное имя с префиксом aa. Для [[ частичным совпадением можно управлять с помощью точного аргумента, который по умолчанию равен NA, указывающему, что частичное совпадение разрешено, но должно приводить к предупреждению, когда оно происходит.

Определение языка просто устарело?


person J. Mini    schedule 12.04.2021    source источник
comment
Использование по умолчанию — x[[i, exact = TRUE]]. Таким образом, вам может потребоваться изменить exact = FALSE, чтобы вернуть значение lett[['a', exact = FALSE]]# [1] 25.   -  person akrun    schedule 12.04.2021
comment
@akrun Смотрите мое последнее редактирование. Я полностью вам верю, но определение языка, похоже, не совпадает?   -  person J. Mini    schedule 12.04.2021


Ответы (1)


На самом деле, я думаю, что определение языка — по крайней мере, частично — действительно устарело. Страница справки 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
person mnist    schedule 12.04.2021