Непоследовательное поведение с числовыми управляющими символами в R - PullRequest
4 голосов
/ 16 апреля 2019

Я невольно столкнулся с этим и задавался вопросом, было ли объяснение этому.В примере с игрушкой я поместил escape-символ на переменном уровне.

  library(dplyr)
  library(gt)
    mt2 <- mutate(mtcars, cylx = ifelse(cyl == 4, "1\2", "2/3"))

Первоначально я думал, что он просто избежит '2', когда цил был 4. Однако 1\2 фактически оценивается как 1\002.Когда вы используете View(mt2), вы не можете его увидеть, но при попытке вывести на экран таблицу gt::gt(mt2) он превращается в специальный символ.Это будет отображаться во всех параметрах печати, но я использовал gt в качестве примера.Итак, мой вопрос: почему r предполагает, что я хотел 1\2 оценить до 1\002?Разве r не должен выдавать ошибку, потому что я не написал явно 1\002 (потому что \2 технически не является escape-символом)?

1 Ответ

2 голосов
/ 16 апреля 2019

Я просто хочу немного смочить ответ @ joran. ?Quote даёт (здесь) причину, когда упоминается восьмеричный код

\ nnn символ с заданным восьмеричным кодом (1, 2 или 3 цифры)

Таким образом, добавление трехзначного восьмеричного кода после \ даст соответствующий номер / символ:

> c('\110' ,'\074', '\076') 
 [1] "H" "<" ">" 

Поэтому, когда вы предоставите '\002', как следует из ссылки, вы получите восьмеричный код 002.

Более того, R не потребует от вас ввода начальных 0 для этих восьмеричных кодов. R просто предполагает, что вы хотели включить их.

 > c('\110' ,'\74', '\76')
 [1] "H" "<" ">" 

 > '\2' == '\002'
 [1] TRUE 

 > '\2' == '\02' 
 [1] TRUE

as.octmode() - это еще один способ думать об этом:

Преобразование или печать целых чисел в восьмеричном формате, с таким количеством цифр, которое необходимо для отображения наибольшего, с использованием начальных нулей.

 > as.octmode("002")
 [1] "2"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...