首页 > 解决方案 > 如何检查是否已经使用 R 中的 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(...,我都会得到相同的结果,所以也不是这样。

如何检查字体是否已准备好在图形中使用?

标签: rggplot2fontsextrafont

解决方案


这是确定 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))

reprex 包于 2021-09-29 创建(v2.0.1)

注意这应该可以在 windows/macOS/linux 上运行,但我只在 macOS 上测试过。此外,@JonSpring 首先评论,所以如果他发布答案,请接受他的而不是我的


推荐阅读