проблема с устройством SVG, выражением () и символами Юникода - PullRequest
2 голосов
/ 20 апреля 2020

У меня проблемы с использованием устройства svg с математическими выражениями и юникодом (в данном случае - левые и правые кавычки). Это происходит только на моем компьютере Windows 10; мой компьютер OSX кажется незатронутым. Рассмотрим следующий код R:

output = tempfile(fileext = ".svg")

svg(file = output)

plot(1, axes=FALSE, ty='n')

## Line A: 
mtext(side = 2, text = expression(paste("A")))
## Line B:
mtext(side = 3, text = expression(paste("“B")))
## Line C: 
mtext(side = 4, text = expression(paste("C")))

axis(1, at = par()$usr[1:2], lab = c("More", "Less"), tick = FALSE)

dev.off()

## Uncomment and run to open the SVG file to look at it 
# browseURL(output)

(обратите внимание на левую кавычку в строке B). После запуска строки C я получаю

Error in mtext(side = 4, text = expression(paste("C"))) : 
  metric information not available for this device
  • Если я изменю устройство на png, я получаю ожидаемый результат.
  • Если я закомментирую строки B и C, я получаю ожидаемый вывод (например, вывод из линий A и оси)
  • Если я закомментирую только строку C, я не получу ожидаемый вывод. Ни линия B не работает, ни ось. Похоже, что-то не так с строкой B, что приводит к сбою и всех последующих элементов чанка.
  • Если я удаляю expression() из строки B, все работает как положено (включая левую кавычку Юникода)
  • Если я изменю шрифт с помощью showtext (подробности см. В проблеме: https://github.com/yihui/knitr/issues/1831) У меня нет проблем.

Появляется, а затем, быть взаимодействием между svg, expression, шрифтом по умолчанию и Unicode. Но только на Windows 10. Мой компьютер OSX (подробности см. Ниже) не имеет проблемы.

sessionInfo()
R version 3.6.2 (2019-12-12)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 18363)

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

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

other attached packages:
[1] reprex_0.3.0

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.4.6    ps_1.3.2        digest_0.6.25   R6_2.4.1        evaluate_0.14   rlang_0.4.5     fs_1.4.1       
 [8] callr_3.4.3     whisker_0.4     rmarkdown_2.1   Cairo_1.5-12    tools_3.6.2     xfun_0.13       compiler_3.6.2 
[15] processx_3.4.2  clipr_0.7.0     htmltools_0.4.0 knitr_1.28.3   

Информация о сеансе OSX (без проблем на этом компьютере)

> xfun::session_info('knitr')
R version 3.6.1 (2019-07-05)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS Catalina 10.15.4, RStudio 1.2.5031

Locale: en_GB.UTF-8 / en_GB.UTF-8 / en_GB.UTF-8 / C / en_GB.UTF-8 / en_GB.UTF-8

Package version:
  evaluate_0.14   glue_1.4.0      graphics_3.6.1  grDevices_3.6.1
  highr_0.8       knitr_1.28.3    magrittr_1.5    markdown_1.1   
  methods_3.6.1   mime_0.9        stats_3.6.1     stringi_1.4.6  
  stringr_1.4.0   tools_3.6.1     utils_3.6.1     xfun_0.12      
  yaml_2.2.1 

Есть идеи, что вызывает это?

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

У меня 32-разрядная Windows работа P C. Это сложная ошибка, чтобы отследить, но в конце концов я обнаружил, что она выбрасывается здесь в графической функции GMMathText. c. Как вы описали, кажется, что это проблема только с expression s, содержащим определенные символы на некоторых графических устройствах. В частности, все, что использует Cairo на Windows, кажется, заглушает палец в одной и той же точке.

После попытки нескольких хаков обойти это, я обнаружил, что лучшее решение - просто использовать bquote вместо expression. Это позволяет вам сохранить все функциональные возможности plotmath, которые вы получаете с expression, не генерируя ошибку:

svg(output)
plot(1, axes=FALSE, ty='n')
mtext(side = 2, text = bquote("A"))
mtext(side = 3, text = bquote("“B"))
mtext(side = 4, text = bquote("C"))
axis(1, at = par()$usr[1:2], lab = c("More", "Less"), tick = FALSE)
dev.off()

, которая дает следующий SVG:

enter image description here

Существует хороший обзор того, как использовать bquote для создания ваших ярлыков, включая все математические выражения, которые вам нужны здесь

0 голосов
/ 27 апреля 2020

Я полагаю здесь что-то вроде догадки, потому что ничего не знаю о R. Однако локальным для вашего поля windows является cp1252, который не содержит кавычек Unicode, но использует умные кавычки Microsoft.

Вы говорите он работает в OS-X, который при просмотре информации о вашем сеансе настроен на использование UTF-8.

Я предполагаю, что ваш программный файл сохраняется как UTF-8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...