Нелатинский текст (например, арабский) в R-графике работает на трех машинах, но не на другом - PullRequest
0 голосов
/ 22 мая 2018

Приведенный ниже пример кода:

arabic <-" السعودية"

png("arabic.png", 500, 500, res = 72)
plot(1, 1, type ="n"); text(1,1, arabic, cex = 4)
dev.off()

sessionInfo()

На одной машине с RServer Studio он работает отлично (подумайте - я не умею читать по-арабски ...):

enter image description here

В то время как на второй машине с RStudio Server (так же как и в Linux) это не так: enter image description here

Вот сессияпервая, работающая машина:

R version 3.3.3 (2017-03-06)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Debian GNU/Linux 9 (stretch)

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

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

loaded via a namespace (and not attached):
[1] tools_3.3.3

и вторая, не работающая:

R version 3.4.4 (2018-03-15)
Platform: x86_64-redhat-linux-gnu (64-bit)
Running under: Amazon Linux 2 (2017.12) LTS Release Candidate

Matrix products: default
BLAS/LAPACK: /usr/lib64/R/lib/libRblas.so

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               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    LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C             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.4.4 tools_3.4.4    yaml_2.1.19 

Я должен также сказать, что я пробовал этот код на машинах Windows с R 3.5 и 3.4.2, и он работает нормально, так что маловероятно, что это версия R является фактором, но что-то о базовых машинах.Я предполагаю, что на нерабочем компьютере отсутствует какая-то поддержка UTF-8, и если бы я знал, что это такое, я мог бы установить его, но я не знаю.

Есть идеи?

Обновление с более широким диапазоном символов

Чтобы добавить к загадке, моя неработающая система работает с некоторыми типами символов (в основном, европейскими), но не с другими.Для иллюстрации:

misc <- "pučina, Māori ¡Qué tranza o qué!"
chinese <- "中華民族"
arabic <-" السعودية"
russian <- "катынь"

plot(1, type = "n")
text(1, 1.2, misc)
text(1,1, chinese)
text(1, 0.8, arabic)
text(1, 0.65, russian)

enter image description here

Китайский и арабский не работают;Русский и сборник европейских наборов символов делают.Также, если кому-то интересно:

> Encoding(arabic)
[1] "UTF-8"
> Encoding(misc)
[1] "UTF-8"
> Encoding(chinese)
[1] "UTF-8"

1 Ответ

0 голосов
/ 23 мая 2018

Так что ответ на это оказался смущающе очевидным.Шрифт по умолчанию, используемый R на машине, которая не работала, просто не имеет глифов для арабских и китайских символов юникода, в то время как другие машины имели.Основная причина этого - загадка, но решение достаточно простое.

Сначала я установил в систему семейство шрифтов с широким охватом символов Юникода. GNU FreeFont казалось хорошим выбором.Я хотел одну семью, которая охватывала бы много языков из-за моего варианта конечного использования (где я не знаю заранее, на каком языке текст написан заранее).

sudo yum install -y gnu-free-*-fonts
sudo R -e "extrafont::font_import(prompt = FALSE)"

Я не уверен, что эта вторая строкаимпортировать шрифты в R необходимо, но это не приносит никакого вреда, и это означает, что я могу использовать extrafont::fonts() в R, чтобы посмотреть, что доступно.

Затем в R есть еще одна строка дополнительного кодаустановить семейство шрифтов с помощью par(family="FreeSans").

misc <- "pučina, Māori ¡Qué tranza o qué!"
chinese <- "中華民族"
arabic <-" السعودية"
russian <- "катынь"


par(family="FreeSans")
plot(1, type = "n")
text(1, 1.2, misc)
text(1,1, chinese)
text(1, 0.8, arabic)
text(1, 0.65, russian)

enter image description here

...