В чем разница между fixed() и coll() для сопоставления строк?

Почти все файлы справки из пакета stringr содержат эту строку

Сопоставьте фиксированную строку (т. е. сравнивая только байты) с помощью fixed(). Это быстро, но приблизительно. Как правило, для сопоставления человеческого текста вам понадобится функция coll(), которая соблюдает правила сопоставления символов для указанной локали.

Базовые пакеты R не включают опцию для функции coll(), они включают только опцию для фиксированной(). Но в базовых пакетах также есть useBytes, для которого в функции установлено значение FALSE, как в grepl.

Является ли fixed() тем же, что и fixed = TRUE, useBytes = TRUE, а coll() тем же, что и fixed = TRUE, useBytes = FALSE? Я новичок в stringr и пытаюсь найти эквивалент.


person Cauder    schedule 15.04.2019    source источник


Ответы (1)


coll() предназначен для «поиска сопоставления». Вот точный пример из vignette("stringr")


coll(x) ищет совпадение с x, используя правила сопоставления человеческого языка, и это особенно важно, если вы хотите выполнить сопоставление без учета регистра. Правила сопоставления различаются в разных странах, поэтому вам также потребуется указать параметр локали.

i <- c("I", "İ", "i", "ı")
i
#> [1] "I" "İ" "i" "ı"

str_subset(i, coll("i", ignore_case = TRUE))
#> [1] "I" "i"
str_subset(i, coll("i", ignore_case = TRUE, locale = "tr"))
#> [1] "İ" "i"

Недостатком coll() является скорость. Поскольку правила распознавания одинаковых символов сложны, coll() работает относительно медленно по сравнению с regex() и fixed(). Обратите внимание, что когда и fixed(), и regex() имеют ignore_case arguments, они выполняют гораздо более простое сравнение, чем coll().


Таким образом, в основном coll() использует информацию из данной локали, чтобы узнать, какие символы в основном означают одно и то же, и позволяет им сопоставляться друг с другом, даже если технически это разные символы.

person MrFlick    schedule 15.04.2019
comment
Похоже, что coll() помогает сопоставлять буквы, которые представляют одну и ту же букву, но могут быть отформатированы по-разному (в разных байтах?). Есть ли случаи, когда coll() соответствует букве с другой буквой, без учета регистра? - person Cauder; 15.04.2019
comment
Ниже приведено руководство пользователя подборщика ICU, ссылка с ?stringi::stri_opts_collator. Судя по их примерам, 'буквы v и w — это две разные буквы в соответствии с английским языком. Тем не менее, v и w традиционно считаются вариантами одной и той же буквы в шведском языке». Так что, если ваш язык — шведский, тогда да (в зависимости от вашего определения). - person Gregor Thomas; 15.04.2019