在Shiny Server部署Shiny应用时遇到编码问题求助
问题概述
本地运行正常的Shiny应用,部署到Ubuntu 22.04系统的Shiny Server(/srv/shiny-server/路径)后无法启动,日志明确指向波兰语特殊字符(ę、ć)解析错误。系统环境已配置为UTF-8,但问题仍存在。
复现代码
library(shiny) library(DT) library(ggplot2) df = data.frame(ę = rep(c("group1", "group2"), 50), ć = rnorm(n = 100)) ui <- fluidPage( # Application title titlePanel("Encoding example"), sidebarLayout( sidebarPanel( "" ), mainPanel( plotOutput("Plot") ) ) ) server <- function(input, output) { output$Plot <- renderPlot({ ggplot(df, aes(ę, ć)) + geom_boxplot() }) } shinyApp(ui = ui, server = server)
错误日志
su: ignoring --preserve-environment, it's mutually exclusive with --login Error in parse(file, keep.source = FALSE, srcfile = src, encoding = enc) : /srv/shiny-server/encoding_debugging/app.R:4:17: unexpected input 3: library(ggplot2) 4: df = data.frame(▒^y ^ Error in sourceUTF8(fullpath, envir = new.env(parent = sharedEnv)) : Error sourcing /srv/shiny-server/encoding_debugging/app.R Calls: runApp ... shinyAppDir -> shinyAppDir_appR -> appObj -> func -> sourceUTF8 Execution halted
系统环境设置
> Sys.getenv('LANG') [1] "en_US.UTF-8" > Sys.getlocale() [1] "LC_CTYPE=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=en_US.UTF-8;LC_COLLATE=en_US.UTF-8;LC_MONETARY=en_US.UTF-8;LC_MESSAGES=en_US.UTF-8;LC_PAPER=en_US.UTF-8;LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=en_US.UTF-8;LC_IDENTIFICATION=C"
解决方案
方法1:确保代码文件以UTF-8无BOM格式保存并声明编码
- 本地保存
app.R时,选择UTF-8无BOM编码(RStudio操作:File -> Save with Encoding -> UTF-8) - 在代码第一行添加编码声明,强制R以UTF-8解析文件:
# -*- coding: utf-8 -*- library(shiny) # 后续代码...
方法2:重命名列名为ASCII字符,可视化时显示原特殊字符
彻底避开变量名中的特殊字符,同时保留前端显示的波兰语字符:
library(shiny) library(DT) library(ggplot2) # 用ASCII字符命名列 df = data.frame(e_pl = rep(c("group1", "group2"), 50), c_pl = rnorm(n = 100)) ui <- fluidPage( titlePanel("Encoding example"), sidebarLayout( sidebarPanel(""), mainPanel(plotOutput("Plot")) ) ) server <- function(input, output) { output$Plot <- renderPlot({ ggplot(df, aes(e_pl, c_pl)) + geom_boxplot() + # 坐标轴显示原波兰语字符 labs(x = "ę", y = "ć") }) } shinyApp(ui = ui, server = server)
方法3:配置Shiny Server强制使用UTF-8编码
- 编辑Shiny Server配置文件(路径:
/etc/shiny-server/shiny-server.conf),在server块中添加环境变量:
server { env LANG=en_US.UTF-8; # 原有配置内容... }
- 重启Shiny Server生效:
sudo systemctl restart shiny-server
内容的提问来源于stack exchange,提问作者Tomasz Wojtas
相关产品推荐
相关产品推荐

