Knitting Rmd по-разному относится к неанглийским иероглифам

Я попытался написать воспроизводимый пример ниже. Это смесь .Rmd и .r. Надеюсь, вы понимаете, почему.

Моя проблема заключается в том, что неанглийские символы обрабатываются по-разному в зависимости от того, запускается ли код непосредственно в консоли или когда он привязан к HTML.

В приведенном ниже примере я создаю небольшой data.frame с символами ü и ö, записываю его в csv, а затем снова читаю.

Если и запись, и чтение происходят внутри или вне блока, тогда все в порядке.

Но если запись и чтение происходят в разных местах, то используется другая кодировка (я думаю). и персонажи путаются.

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

Насколько я понимаю, локаль всегда одна и та же, поэтому я не понимаю, что происходит.

Любые идеи?

Напишите и прочтите csv напрямую, чтобы создать новый файл данных

df2 <- data.frame(Cäl1 = c(1,2), Col2 = c("ü","a")) 

write.csv(df2, file="df2.csv")

read.csv("df2.csv")

Sys.getlocale(category = "LC_ALL")

Теперь попробуйте связать весь документ (просто запуск чанка ведет себя по-другому)

```{r read_inside}

read.csv("df2.csv")

Sys.getlocale(category = "LC_ALL")

```

этот второй фрагмент будет работать, потому что data.frame создается внутри фрагмента

```{r write_read_inside}


df2 <- data.frame(Cäl1 = c(1,2), Col2 = c("ü","a")) 
write.csv(df2, file="df2.csv")
read.csv("df2.csv")

Sys.getlocale(category = "LC_ALL")

```

Информация о сеансе:

R version 2.15.0 (2012-03-30)
Platform: x86_64-pc-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United Kingdom.1252  LC_CTYPE=English_United Kingdom.1252    LC_MONETARY=English_United Kingdom.1252
[4] LC_NUMERIC=C                            LC_TIME=English_United Kingdom.1252    

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

loaded via a namespace (and not attached):
[1] tools_2.15.0

person Andrew    schedule 24.06.2012    source источник
comment
Я попробовал ваши примеры и не смог подтвердить то, что вы нашли (Windows 7, немецкий язык). Было бы хорошо, если бы вы могли опубликовать sessionInfo () (который также содержит локаль), проблема может быть связана с платформой.   -  person Dieter Menne    schedule 24.06.2012
comment
Windows - это ад с точки зрения кодировки. * nix часто последовательно использует UTF-8. Вероятно, вы можете попробовать сохранить свои данные в кодировке UTF-8, например write.csv(..., fileEncoding = 'UTF-8') (не проверено)   -  person Yihui Xie    schedule 25.06.2012
comment
Спасибо @Yihui, добавление, fileEncoding = 'UTF-8' исправило ситуацию. В моей системе кажется, что UTF-8 используется по умолчанию при вязании, но не иначе. Мне нужно преобразовать мои файлы данных в UTF-8 без спецификации, а затем убедиться, что UTF-8 всегда используется при чтении csv.   -  person Andrew    schedule 25.06.2012
comment
@Andrew на самом деле другой путь (более естественный) - использовать options(encoding = 'native.enc') в вашем R-коде, но я все же рекомендую последовательно использовать UTF-8.   -  person Yihui Xie    schedule 25.06.2012


Ответы (1)


Итак, ответ - гарантировать кодировку UTF8, например. write.csv(..., fileEncoding = 'UTF-8'). Основная проблема заключалась в том, что RStudio по умолчанию использует UTF8, а R по умолчанию использует собственную кодировку ОС. Мы можем либо попросить R использовать UTF8 в write.csv, либо попросить RStudio использовать собственную кодировку (options(encoding = 'native.enc')).

person Yihui Xie    schedule 25.06.2012