You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Shiny应用发布失败(错误码1):找不到windowsFonts函数求助

解决Shiny应用发布失败:windowsFonts()找不到的问题

嘿,我一眼就看出问题根源了——windowsFonts()Windows系统独有的函数,而Shiny服务器(不管是自建的Linux服务器,还是shinyapps.io这类托管平台)用的都是类Unix环境,根本没有这个函数,所以发布时直接触发报错,导致应用启动失败。下面是一步步的解决方案:

1. 替换Windows专属字体设置为跨平台方案

推荐用showtext包处理字体,它支持Windows、Mac、Linux全平台,能完美替代windowsFonts()的功能:

  • 先安装包:
    install.packages("showtext")
    
  • 在你的Rmarkdown或Shiny代码开头添加以下代码:
    library(showtext)
    # 加载字体:可以用系统已有的字体,或者自定义字体文件
    # 示例1:加载Linux服务器默认自带的"DejaVu Sans"
    font_add("my_custom_font", "DejaVu Sans")
    # 示例2:如果要用自定义字体(比如微软雅黑),把字体文件放在应用根目录,用相对路径
    # font_add("my_custom_font", "./MSYH.TTF")
    showtext_auto() # 自动启用showtext的字体渲染
    
  • 删除原来代码中调用windowsFonts()的部分,把字体引用改成你刚才定义的名称,比如ggplot的主题设置:
    # 原来的Windows专属代码
    # windowsFonts(MyFont = windowsFont("微软雅黑"))
    # ggplot(...) + theme(text = element_text(family = "MyFont"))
    
    # 修改后的跨平台代码
    ggplot(...) + theme(text = element_text(family = "my_custom_font"))
    

2. 处理"The following object is masked from XXX"提示

这个其实是警告信息,不是导致发布失败的直接原因,但可以优化代码消除它:

  • 先用conflicts()函数查看哪些函数存在冲突:
    conflicts()
    
  • 解决办法:要么明确指定包名调用函数(比如dplyr::filter()代替filter()),要么调整包的加载顺序——把可能覆盖其他函数的包放在后面加载,或者用library(package, warn.conflicts = FALSE)关闭冲突警告(不推荐,但如果不影响功能可以临时用)。

3. 发布前的验证步骤

  • 修改后先在本地运行,确保PDF下载和Shiny应用都正常工作;
  • rsconnect::checkApp()检查应用的依赖和潜在问题:
    library(rsconnect)
    checkApp("你的应用目录路径")
    
  • 如果托管到shinyapps.io,记得把自定义字体文件(比如MSYH.TTF)一起上传到应用目录,确保服务器能读取到。

按照这些步骤修改后,你的应用应该就能正常发布了!

内容的提问来源于stack exchange,提问作者Suzanne.Yang

火山引擎 最新活动