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

#r #ggplot2 #fonts #extrafont

Вопрос:

Я написал функцию для обмена данными между коллегами для построения графиков, и моя организация предпочитает Calibri для текста по умолчанию ggplot2 Arial. Если бы я был единственным человеком, который использовал бы эту функцию, я бы сначала сделал это в верхней части своего сценария:

  library(extrafont)
 font_import()
 loadfonts(device="win")
 

а затем составьте мой график ggplot2. Кажется, мне нужно сделать это только font_import() один раз на данной машине, но затем мне нужно делать loadfonts(device="win") это каждый раз, когда я начинаю новый сеанс. Я не очень хорошо разбираюсь в том, что они делают, но если я не выполню этот loadfonts шаг, мой график не будет использовать Calibri.

Я бы хотел, чтобы функция построения графиков, которую я написал, работала для других, и я хотел бы проверить, выполнили ли они уже эти шаги, и дать им полезное сообщение об этом, если они этого не сделали. Я думал, что смогу использовать fonts() , а затем проверить, был ли Calibri указан в выходных данных, но я думаю, что это проверяет только те шрифты, которые я когда-либо загружал font_import() за всю историю использования этой машины. Я также подумал, что, может быть,

  systemfonts::match_font("Calibri")
 

проверил бы, но я получаю тот же результат независимо от того , бегал ли я уже loadfonts(... , так что это тоже не так.

Как проверить, готов ли шрифт к использованию на графике?

Комментарии:

1. Я думаю showtext , что вместо этого вы могли бы использовать шрифт Calibri на других компьютерах без необходимости выполнения шага extrafont::loadfonts.

2. Попробуй с names(grDevices::windowsFonts()) .

3. @JonSpring: Что showtext делает? Из какой это посылки? Я не могу его найти.

4. @стефан: Это подскажет мне, есть ли у меня варианты шрифтов с засечками, без засечек или в монофоническом стиле, но на самом деле это не подскажет мне семейство шрифтов.

5. Согласен с @JonSpring — showtext — это то, как я подошел бы к этой задаче, например install.packages("showtext"); library(showtext); list_of_fonts <- as.data.frame(font_files()); grep(pattern = "Calibri", x = list_of_fonts$family, ignore.case = TRUE, value = TRUE)

Ответ №1:

Вот один из возможных подходов к определению того, установлен ли Calibri и «пригоден ли он для использования».:

 install.packages("showtext")
library(showtext)
list_of_fonts <- as.data.frame(font_files())

grep(pattern = "Calibri", x = list_of_fonts$family, ignore.case = TRUE, value = TRUE)
 

Вы можете реализовать это несколькими способами, например, загрузить шрифт Calibri, если он доступен, или распечатать сообщение, если оно недоступно в системе:

 if (!require(showtext)) install.packages("showtext")
#> Loading required package: showtext
#> Loading required package: sysfonts
#> Loading required package: showtextdb
library(showtext)
list_of_fonts <- as.data.frame(font_files())
if(any(grepl("Calibri.ttf", list_of_fonts, ignore.case = TRUE))){
  Calibri <- list_of_fonts[list_of_fonts$file == "Calibri.ttf",]
  sysfonts::font_add(family = "Calibri",
                     regular = list.files(path = Calibri$path,
                                          pattern = "Calibri.ttf",
                                          full.names = TRUE))
  print("Calibri available")
} else{
  print("Calibri not found")
}
#> [1] "Calibri available"

library(ggplot2)
showtext_auto()
ggplot(mtcars, aes(wt, mpg))  
  geom_point()  
  ggtitle("Example plot")  
  theme(text = element_text(family = "Calibri", size = 22))
 

Создано 2021-09-29 пакетом reprex (v2.0.1)

N. B. Это должно работать в Windows/macOS/linux, но я тестировал его только на macOS. Кроме того, @JonSpring прокомментировал первым, поэтому, если он опубликует ответ, пожалуйста, примите его вместо моего