如何使用 R 中的 extrafont 包检查给定字体是否已加载?

How can I check whether a given font has been loaded already using extrafont package in R?

我写了一个函数来与同事共享绘图,我的组织更喜欢 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(...,我都会得到相同的结果,所以也不是。

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

这是确定是否安装了 Calibri 的一种可能方法 'useable':

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 package (v2.0.1)

于 2021-09-29 创建

N.B。这应该适用于 windows/macOS/linux 但我只在 macOS 上测试过。另外,@JonSpring 首先发表评论,所以如果他发布了答案,请接受他的而不是我的