是否可以在 R 中测试指定的 `grDevices::windowsFonts` 是否存在,并在测试失败时指定备份?

Is it possible in R to test for the existence of specified `grDevices::windowsFonts` and specify a backup if the test fails?

我正在开发一个 ggplot2 扩展包供我的组织使用,以便将我们的设计指南应用于我们所有的 R 图表。其中一部分需要使用特定的字体。我们在发布的可视化效果中使用 Whitney 字体,但并非所有用户都在其计算机上安装了所需的字体。我希望该软件包检查是否安装了 Whitney,如果没有,则指定一种替代的、广泛使用的字体(例如 Calibri)用作备份。

无论 "Whitney Medium" 是否实际安装在 PC 上,以下代码都会 运行 成功,没有警告。如果没有安装,打印出来的文字会显示Arial。

grDevices::windowsFonts(font_reg = "Whitney Medium")
graphics::plot(c(0,2), c(0,2), type="n", xlab="", ylab="")
graphics::par(family="font_reg")
graphics::text(1, 1, "font_reg", cex=4)

如何验证 "Whitney Medium" 是给定 PC 上的有效字体,如果不是则指定备份?

注意:我们的 Whitney 字体文件是 OTF,不是 TTF,所以我不能使用 extrafont 包。我也想避免使用 showtext 因为我真的想找到一个在 RStudio 绘图中有效的解决方案 window.

如果您需要自动执行此操作,可能需要覆盖 windowsFonts 的代码。当不带参数调用时,可用字体作为命名列表返回。否则,您可能会尝试将其作为您的策划电话的序言:

 if ("Whitney Medium" %in% names( windowsFonts()) ) {  .. proceed as usua } else {
                                                windowsFonts("sans" = "Arial") }

如果您将 font_reg 作为传递给图形函数的文本值,那么您可以使用它来代替 "sans"。

我最终使用 sysfonts::font_files() 来识别 installed/available 字体,如果 Whitney 不在结果中则使用 Calibri。

whitney_fonts <- dplyr::filter(sysfonts::font_files(),
  family == "Whitney Medium"
)
if (length(whitney_fonts$family) > 0) {
  grDevices::windowsFonts(font_reg = "Whitney Medium")
} else {
  grDevices::windowsFonts(font_reg = "Calibri")
}