r - 如何检查是否已经使用 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(...
,我都会得到相同的结果,所以也不是这样。
如何检查字体是否已准备好在图形中使用?
解决方案
这是确定 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 首先评论,所以如果他发布答案,请接受他的而不是我的
推荐阅读
- swift - Swift ui 雷达图
- javascript - 如果我也提供了正确的密码,为什么我的页面没有重定向到 Google?请看我的代码
- inno-setup - 在 Inno Setup 中检查空格和特殊符号的安装路径
- python - 使用 python 向 gdb 中的 stdio 提供输入
- r - 从散点图中找到 2 个回归方程/斜率并比较方程/斜率
- python - 导入 pandas df 时删除/忽略 .dat 的前两行
- css - 使具有较小 z-index 的元素可点击
- drupal - Drupal 8 Gutenberg 模块正在阻止对现有网络表单元素的编辑并添加新元素
- tensorflow - 我们可以通过仅省略 pbtxt 标签映射文件中的标签来忽略 Tensorflow 对象检测 API 中不必要的类吗?
- python - Discord Bot Python 如何连接表情符号