【问题标题】:Using custom fonts on shinyapps.io在 shinyapps.io 上使用自定义字体
【发布时间】:2019-01-19 14:05:25
【问题描述】:

我想在 shinyapps.io 上的闪亮应用(在绘图上)中使用自定义字体。我的 Roboto-Regular.ttf 在./www/ 目录中。这是我的 app.R 文件的上半部分:

dir.create('~/.fonts')
system("chmod +x ./www/Roboto-Regular.ttf")
system("cp ./www/Roboto-Regular.ttf ~/.fonts/")
system('fc-cache -f -v ~/.fonts/')
system('fc-match Roboto')

library(ggplot2)
library(shiny)
library(shinythemes)

library(extrafont)
font_import(pattern="Roboto",prompt=FALSE)
loadfonts()
print(fonts())

在部署应用程序时,我最终遇到如下错误:

Registering fonts with R
Scanning ttf files in /usr/share/fonts/, ~/.fonts/ ...
Extracting .afm files from .ttf files...
/home/shiny/.fonts/Roboto-Regular.ttfWarning in gzfile(dest, "w") :
  cannot open compressed file '/opt/R/3.5.1/lib/R/library/extrafontdb/metrics/Roboto-Regular.afm.gz', probable reason 'Permission denied'
Error in value[[3L]](cond) : cannot open the connection
Calls: local ... tryCatch -> tryCatchList -> tryCatchOne -> <Anonymous>
Execution halted

有谁知道可能出了什么问题?

【问题讨论】:

  • 我遇到了同样的问题。同时你也想通了吗?
  • 我已经添加了我从 RStudio 得到的关于此的回复。如果可行,请告诉我,我会接受它作为答案。

标签: shiny shinyapps


【解决方案1】:

复活一个老话题,但使用自定义字体没有什么特别之处,只需将其添加到 www 文件夹并创建 CSS 规则以应用于感兴趣的标签。

详情请查看here

【讨论】:

    【解决方案2】:

    经过一番努力,我找到了一个更简单的解决方案,适用于shinyapps.io

    我们开始吧:

    1. 将自定义字体放在www 目录中:例如IndieFlower.ttf 来自here
    2. 按照here 的步骤进行操作

    这导致app.R 文件的以下上部:

    dir.create('~/.fonts')
    file.copy("www/IndieFlower.ttf", "~/.fonts")
    system('fc-cache -f ~/.fonts')
    

    由于 Linux 会在 .fonts 目录中搜索字体,因此您不需要 extrafont 包,但您可以直接使用这些字体,例如:

    ggplot(mapping=aes(x=seq(1,10,.1), y=seq(1,10,.1))) +
          geom_line(position="jitter", color="red", size=2) + theme_bw() +
          theme(text=element_text(size = 16, family = "IndieFlower"))
    

    【讨论】:

    • 非常感谢您提供此解决方案。这是我绘制带有日文标签的树状图的必要步骤,因为 treemap() 函数似乎没有找到合适的字体来呈现日文字符。
    • 这个解决方案在 2021 年对我有用
    【解决方案3】:

    这是我从 RStudio 收到的关于此的答案。我自己没有测试过。

    嗨,

    我们的开发人员能够告知这是由于他们在创建 extrafont 和相关的 extrafontdb 包时做出的可能不幸的设计选择。 extrafont 字体数据库存储在 extrafontdb 包目录中——这基本上就是 extrafontdb 包的全部用途。

    这意味着 extrafontdb 目录需要是用户可写的。如果用户安装包,这将正常工作,但如果 root 安装包(如 shinyapps.io 上的情况),那么它将无法工作。

    一种可能的解决方法是将 extrafontdb 包安装到应用程序子目录中的库中。

    要做到这一点:创建一个r-lib/ 子目录,并在那里下载 extrafontdb 源包:

    dir.create('r-lib')
    download.file('https://cran.r-project.org/src/contrib/extrafontdb_1.0.tar.gz','r-lib/extrafontdb_1.0.tar.gz')
    

    部署后,该应用将包含此 r-lib/ 子目录和 extrafontdb 源包。

    然后,在应用顶部,将源包中的 extrafontdb 包安装到 r-lib 目录中。

    .libPaths(c('r-lib', .libPaths()))
    install.packages('r-lib/extrafontdb_1.0.tar.gz',type = 'source',repos = NULL)
    

    他们在 shinyapps.io 上部署了一个执行 extrafontdb 安装的应用程序,它运行良好。设置 libpath,以便 install.packages() 将从提供的源包安装到应用程序的 r-lib/ 子目录。

    如果您能够执行上述操作或有任何其他问题,请告诉我们。

    谢谢,

    【讨论】:

    • 感谢您发布此信息。我想我离得更近了..但它仍然对我不起作用。看我的问题here
    猜你喜欢
    • 2019-08-01
    • 2020-10-22
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 2013-07-19
    相关资源
    最近更新 更多