Что означают экранированные обратной косой чертой числа от \ 1 до \ 7 в строках R и почему они сравниваются неправильно? - PullRequest
2 голосов
/ 17 марта 2019

Числа от 1 до 7 с обратной косой чертой, похоже, ничего не делают при печати. ​​

Мне любопытно, как R их интерпретирует, отчасти потому, что они, кажется, подчиняются некоторым странным правилам сравнения:

'\1' == '\2' # FALSE
'\1' <  '\2' # FALSE
'\1' >  '\2' # FALSE
'\1' <= '\2' # TRUE
'\1' >= '\2' # TRUE

РЕДАКТИРОВАТЬ: Поведение, кажется, зависит от платформы, так что вот мой sessionInfo

R version 3.5.2 (2018-12-20)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Arch Linux

Matrix products: default
BLAS: /usr/lib/libopenblasp-r0.3.5.so
LAPACK: /usr/lib/liblapack.so.3.8.0

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C
 [9] LC_ADDRESS=C               LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

loaded via a namespace (and not attached):
[1] compiler_3.5.2

1 Ответ

3 голосов
/ 17 марта 2019

Это восьмеричные константы / литералы для символов ASCII : "Обратные слеши, за которыми следуют до трех чисел, интерпретируются как восьмеричная запись для символов ASCII"

\ 1 означает \ 001, \ 2 означает \ 002 и т. Д .; оба из них непечатаемые управляющие символы (точнее, SOM и EOA) . Они не эквивалентны строкам '1', '2', я думаю, вы предполагаете, что они есть или должны быть.

Вы можете увидеть их фактические необработанные числовые значения с помощью:

> charToRaw('\1')
[1] 01
> charToRaw('\2')
[1] 02
> charToRaw('1')
[1] 31
> charToRaw('2')
[1] 32
> charToRaw('\001')
[1] 01
> charToRaw('\002')
[1] 02
  • Не говорите "экранированный от оболочки", если вы имеете в виду "экранированный от обратной косой черты". Не думайте, что R рассматривает экранирование так же, как оболочка Unix; они разные.
  • Да. Я согласен, что обнаруженное вами поведение сравнения </==/> странное и непоследовательное. Я подтверждаю, что получил те же результаты в R 3.5.1 для MacOS в локали en_US.UTF-8.
  • Но я не знаю, гарантирует ли язык R сравнение строковых порядков на непечатаемых константах ASCII ниже 32 десятичных знаков («порядок сопоставления» / «последовательность сопоставления»; это было делом со времен Фортрана еще в 1960-х годах). Может быть, достоин незначительной ошибки в лучшем случае. Большинство спецификаций языков предупреждают, что использование любого значения ASCII ниже 32 может привести к странному / неопределенному поведению.
  • Для получения дополнительной информации введите ?base::Quotes или см. R Определение языка: 10.3.1 Константы: восьмеричные символы
...