ggplot с настроенным шрифтом не отображается должным образом на shinyapps.io - PullRequest
2 голосов
/ 11 марта 2019

Я могу настроить шрифт в ggplot с помощью:

library(extrafont)

windowsFonts()
font_import(pattern = "comic", prompt = FALSE)
loadfonts(device = "win")
windowsFonts()

ggplot(mapping=aes(x=seq(1,10,.1), y=seq(1,10,.1))) + 
  geom_line(position="jitter", color="red", size=2) + theme_bw() +
  theme(text=element_text(size=16,  family="Comic Sans MS"))

Это выглядит как:

enter image description here

Подробнее по теме, например здесь и здесь


Я также могу интегрировать этот сюжет и дополнительный шрифт в блестящее приложение, которое работает локально какследующим образом:

library(ggplot2)
library(extrafont)
library(shiny)

font_import(paths = "www", pattern = "comic", prompt = FALSE)
loadfonts()
print(fonts())

ui <- fluidPage(plotOutput("plot"),textOutput("fonts"))

server <- function(input, output) {
   output$plot <- renderPlot({
     ggplot(mapping=aes(x=seq(1,10,.1), y=seq(1,10,.1))) + 
       geom_line(position="jitter", color="red", size=2) + theme_bw() +
       theme(text=element_text(size=16,  family="Comic Sans MS"))
   })
   output$fonts <- renderText(print(fonts()))
}

shinyApp(ui = ui, server = server)

Однако, когда я пытаюсь развернуть это на shinyapps.io, я получаю сообщение об ошибке:

Не удалось запустить приложение (завершение работы с кодом 1).

Регистрация шрифтов с помощью R Сканирование файлов ttf на www ... Извлечение файлов .afm из файлов .ttf ... /srv/connect/apps/21-comic-font/www/comici.ttfWarnung ingzfile (dest, "w") kann komprimierte Datei '/opt/R/3.4.3/lib/R/library/extrafontdb/metrics/comici.afm.gz' nicht öffnen.Грунд евтл.«Отказано в доступе» Фелер в значении [3L]: kann Verbindung nicht öffnen Ruft auf: local ... tryCatch -> tryCatchList -> tryCatchOne -> Ausführung angehalten


Я пытался решить эту проблемувключив ответ от здесь .Я добавил свои файлы .ttf в каталог www и источник пакета extrafontdb в каталог r-lib.(И, конечно, я развернул оба ..).

Полный файл app.R теперь выглядит следующим образом:

.libPaths(c('r-lib', .libPaths()))
install.packages('r-lib/extrafontdb_1.0.tar.gz',type = 'source',repos = NULL)

library(ggplot2)
library(extrafontdb)
library(extrafont)
library(shiny)

font_import(paths = "www", pattern = "comic", prompt = FALSE)
loadfonts()
print(fonts())

ui <- fluidPage(plotOutput("plot"),textOutput("fonts"))

server <- function(input, output) {
  output$plot <- renderPlot({
    ggplot(mapping=aes(x=seq(1,10,.1), y=seq(1,10,.1))) +
      geom_line(position="jitter", color="red", size=2) + theme_bw() +
      theme(text=element_text(size=16,  family="Comic Sans MS"))
  })
  output$fonts <- renderText(print(fonts()))
}

shinyApp(ui = ui, server = server)

При развертывании этого приложения я получаю работающее приложение и следующий вывод:

enter image description here

Теперь странно то, что renderText(print(fonts())) печатает Comic Sans MS .Так что кажется , что мой шрифт загружен.Но сюжет не показывает правильный шрифт.

Почему это так?И как я могу это решить?

1 Ответ

0 голосов
/ 14 марта 2019

Я нашел решение, которое, кажется, работает на shinyapps.io (но не локально, поскольку это решение только для Linux. И почему-то оно не работает с моим оригинальным шрифтом ComicSans MS, но этот шрифтвсе равно не красиво ..; -))

Вот и мы:

  1. Поместите пользовательский шрифт в каталог www: например, IndieFlower.ttf из здесь
  2. Выполните шаги из здесь

Это приводит к следующему app.R файлу:

ibrary(ggplot2)
library(shiny)

dir.create('~/.fonts')
file.copy("www/IndieFlower.ttf", "~/.fonts")
system('fc-cache -f ~/.fonts')

ui <- fluidPage(plotOutput("plot"))

server <- function(input, output) {
  output$plot <- renderPlot({
    ggplot(mapping=aes(x=seq(1,10,.1), y=seq(1,10,.1))) +
      geom_line(position="jitter", color="red", size=2) + theme_bw() +
      theme(text=element_text(size = 16, family = "IndieFlower"))
  })
}

shinyApp(ui = ui, server = server)

Сюжет выглядиткак:

enter image description here

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