Я недавно прочитал этот раздел 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
, указывающему, что частичное совпадение разрешено, но должно приводить к предупреждению, когда оно происходит.
Определение языка просто устарело?
x[[i, exact = TRUE]]
. Таким образом, вам может потребоваться изменитьexact = FALSE
, чтобы вернуть значениеlett[['a', exact = FALSE]]# [1] 25
. - person akrun   schedule 12.04.2021