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

6

我已经编写了一个函数,可以在同事之间共享用于绘图。我的组织更喜欢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来代替extrafont::loadfonts步骤,这样就可以在其他人的计算机上使用Calibri字体了。 - Jon Spring
尝试使用 names(grDevices::windowsFonts()) - stefan
@JonSpring: showtext是做什么用的?它是哪个软件包提供的?我找不到它。 - shirewoman2
@stefan:这将告诉我是否有衬线字体、无衬线字体或等宽字体的选项,但它实际上并不会告诉我字体系列。 - shirewoman2
同意@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) - jared_mamrot
太好了!谢谢!如果@jared_mamrot或JonSpring其中一个把它作为答案发布,我会很乐意接受的。 - shirewoman2
1个回答

3

以下是一种可能的方法来确定是否已安装并可用 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包(v2.0.1)在2021年9月29日创建的。

注意:虽然此代码应该可以在Windows / macOS / Linux上运行,但我仅在macOS上进行了测试。此外,@JonSpring先发表了评论,所以如果他发布答案,请接受他的答案而不是我的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接