R: загрузить предупреждения - PullRequest
0 голосов
/ 10 января 2020

У меня есть файл foo, основанный на утилите file:

foo: LaTeX 2e document, UTF-8 Unicode text, with CRLF, LF line terminators

У меня есть следующий мета-код

txt <- readLines("foo")
....
save(txt, file="bar")
load("bar")
There were 50 or more warnings (use warnings() to see the first 50)
warnings()
Warning messages:
1: In load("bar") :
  input string '...' cannot be translated to UTF-8, is it valid in 'ANSI_X3.4-1968'?
2: ...

Предупреждения вызывают некоторые части вектора символов txt, который будет вырезан при последующем сохранении с помощью writeLines Я не смог найти объяснения для предупреждений. Предупреждения появляются для строк в файле TeX с акцентированными буквами

1 Ответ

0 голосов
/ 12 января 2020

В Linux, R реагирует на значение переменной окружения LANG. Если для него не задан языковой стандарт UTF-8, R не сможет управлять этим типом кодировки.

Так что если вызов R выполняется следующим образом (без UTF-8):

LANG=en_US R

консоль выдает:

a <- rawToChar(as.raw(c(0xc3, 0xa0)))
a
# [1] "\303\240"
tmp <- file("/tmp/foo", encoding="UTF-8")        
writeLines(a, tmp)
# Warning message:
# In writeLines(a, tmp) : invalid char string in output conversion
close(tmp)
readLines("/tmp/foo")
# character(0)

Без языкового стандарта UTF-8 значение a (с ударением a) печатается как необработанные байты. Принудительное кодирование UTF-8 при записи в файл выдает предупреждение и ничего не печатается.

Вызов с:

LANG=en_US.UTF-8 R

не дает ошибок:

a <- rawToChar(as.raw(c(0xc3, 0xa0)))
a
# [1] "à"
tmp <- file("/tmp/foo", encoding="UTF-8")        
writeLines(a, tmp)
close(tmp)
readLines("/tmp/foo")
# [1] "à"

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

В Windows R не реагирует на переменную LANG, а кодировка зависит от установленного языка Windows. Для латинских языков это ANSI. Это упрощает переносимость внутри Windows, но R неправильно читает Linux файлы данных, основанные на UTF-8.

...