Непоследовательное поведение между str_split и strsplit - PullRequest
7 голосов
/ 10 сентября 2011

В документации для str_split в пакете stringr указано, что для аргумента шаблона:

If "" разделяется на отдельные символы.

, что предполагает, что он ведет себя так же, как strsplit в этом отношении.Однако

library(stringr)
str_split("abcab","")
[[1]]
[1] ""  "a" "b" "c" "a" "b"

с пустой пустой строкой.Это сравнимо с

strsplit("abcab","")
[[1]]
[1] "a" "b" "c" "a" "b"

При разделении на непустые строки, ведение пустых строк кажется нормальным поведением,

strsplit("abcab","ab")
[[1]]
[1] ""  "c"

, но даже тогда str_split генерирует «дополнительные»завершающая пустая строка:

str_split("abcab","ab")
[[1]]
[1] ""  "c" "" 

Является ли это несоответствие ошибкой, особенностью, ошибкой в ​​документации или просто другим понятием «ожидаемого поведения»?

1 Ответ

4 голосов
/ 12 октября 2011

Если вы используете запятые в качестве разделителей, «ожидаемый» (ваш пробег может отличаться) результат будет более очевидным:

# expect "" "2" "3" "4" ""

strsplit(",2,3,4,", ",")
# [[1]]
# [1] ""  "2" "3" "4"

str_split(",2,3,4,", ",")
# [[1]]
# [1] ""  "2" "3" "4" "" 

Если у меня n запятых, то я ожидаю, что (n+1) элементов будетвернулся.Поэтому я предпочитаю результаты из str_split.Однако я не обязательно назвал бы это ошибкой в ​​strsplit, так как in работает так, как объявлено:

(из? Strplit) Обратите внимание, что это означает, что если в начале совпадения есть совпадение(непустая) строка, первый элемент выходных данных - "" ", но если в конце строки есть совпадение, выходные данные такие же, как и при удаленном совпадении.

"" сложнее, так как невозможно подсчитать, сколько раз "" появляется в строке.Поэтому рассмотрение его как особого случая представляется оправданным.

(из? Str_split) Если '""' разбивается на отдельные символы.

Исходя из этого, я предлагаю вам иметьнашел ошибку и должен воспользоваться советом Хадли и сообщить об этом!

...