Docker化含ggvis包的R Shiny应用时textOutput不显示问题排查
Docker化含ggvis的Shiny应用后textOutput组件消失问题排查
问题现象
- 本地运行Shiny应用时,
textOutput("size")正常显示iris数据集行数(150),ggvis散点图也能正常渲染 - 将应用Docker化部署后,浏览器打开容器中的应用,
textOutput("size")内容消失,但ggvis图表仍能正常显示
相关代码
Shiny应用原代码
library(shiny) library(ggvis) df <- iris ui <- fluidPage( textOutput("size"), br(), ggvisOutput("cloudPoint"), ) server <- function(input, output, session) { output$size <- renderText({ nrow(df) }) output$cloudPoint <- reactive({ df %>% ggvis::ggvis(~Sepal.Length,~Sepal.Width)%>% bind_shiny("cloudPoint") }) } shinyApp(ui, server)
Dockerfile
FROM rocker/shiny-verse RUN R -e "install.packages(c('ggvis'))" COPY /shinyapp/ /srv/shiny-server/
问题原因
server端对ggvis输出的处理方式错误:
- ggvis的
bind_shiny函数本身负责将可视化绑定到指定的输出容器(即ggvisOutput("cloudPoint")),不需要将其包裹在reactive()中并赋值给output$cloudPoint - 错误的赋值方式干扰了Shiny的输出渲染上下文,Docker环境下Shiny的输出调度逻辑更严格,因此导致
textOutput("size")无法正常渲染;本地环境可能因缓存或环境差异暂时掩盖了该问题
解决方案
修改server代码,移除错误的output$cloudPoint赋值,直接执行ggvis的绑定逻辑:
library(shiny) library(ggvis) df <- iris ui <- fluidPage( textOutput("size"), br(), ggvisOutput("cloudPoint"), ) server <- function(input, output, session) { output$size <- renderText({ nrow(df) }) # 直接执行ggvis绑定,无需赋值给output对象 df %>% ggvis::ggvis(~Sepal.Length, ~Sepal.Width) %>% bind_shiny("cloudPoint") } shinyApp(ui, server)
修改后重新构建Docker镜像并运行,textOutput("size")和ggvis图表都能正常显示。
内容的提问来源于stack exchange,提问作者SunRicq
相关产品推荐
相关产品推荐

