Подтвердить что ты не робот

Письмо "y" появляется после "i" при сортировке по алфавиту

При использовании функции sort(x), где x является символом, буква "y" перескакивает в середину, сразу после буквы "i":

> letters
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t"
[21] "u" "v" "w" "x" "y" "z"

> sort(letters)
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "y" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
[21] "t" "u" "v" "w" "x" "z"

Причиной может быть то, что я нахожусь в Литве, и это "литовская" сортировка писем, но мне нужна нормальная сортировка. Как изменить метод сортировки обратно в норму внутри R-кода?

Я использую R 2.15.2 на Win7.

4b9b3361

Ответ 1

Вам нужно изменить локаль, в которой работает R. Либо сделайте это для всей вашей установки Windows (что кажется субоптимальным), либо в пределах R-сеансов с помощью:

Sys.setlocale("LC_COLLATE", "C")

Вместо "C" вы можете использовать любую другую допустимую строку locale, но это должно вернуть вас к порядку сортировки для letters, который вы хотите.

Подробнее читайте ?locales.

Я полагаю, стоит отметить сестринскую функцию Sys.getlocale(), которая запрашивает текущую настройку параметра locale. Следовательно, вы могли бы сделать

(locCol <- Sys.getlocale("LC_COLLATE"))
Sys.setlocale("LC_COLLATE", "lt_LT")
sort(letters)
Sys.setlocale("LC_COLLATE", locCol)
sort(letters)
Sys.getlocale("LC_COLLATE")

## giving:
> (locCol <- Sys.getlocale("LC_COLLATE"))
[1] "en_GB.UTF-8"
> Sys.setlocale("LC_COLLATE", "lt_LT")
[1] "lt_LT"
> sort(letters)
 [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "y" "j" "k" "l" "m" "n"
[16] "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "z"
> Sys.setlocale("LC_COLLATE", locCol)
[1] "en_GB.UTF-8"
> sort(letters)
 [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o"
[16] "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"
> Sys.getlocale("LC_COLLATE")
[1] "en_GB.UTF-8"

который, конечно же, является тем, что @Hadley Answer показывает with_collate(), делая несколько более лаконично, как только вы установили devtools.

Ответ 2

Если вы хотите сделать это временно, devtools предоставляет функцию with_collate:

library(devtools)
with_collate("C", sort(letters))
# [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
# [20] "t" "u" "v" "w" "x" "y" "z"
with_collate("lt_LT", sort(letters))
# [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "y" "j" "k" "l" "m" "n" "o" "p" "q" "r"
# [20] "s" "t" "u" "v" "w" "x" "z"