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




