You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言Shiny应用绘图异常:生成的图表为空

问题原因与解决方案

你的ggplot代码在Shiny中生成空图的核心原因是:ggplot2的aes()函数无法直接解析字符串形式的列名。当你使用x = input$feature时,input$feature返回的是选中的字符串(比如"UTR length"),但aes()默认会把它当作一个字面量变量名去数据框中查找,而不是将字符串解析为对应的列名,导致ggplot找不到有效数据,最终生成空图。

下面是几种可行的修正方案:

方案1:使用.data代词(推荐)

这是tidyverse官方推荐的方法,通过.data[[字符串]]的形式直接引用列名:

library(shiny)
library(ggplot2)
library(tidyverse)
library(shinythemes) # 必须加载该包才能使用shinytheme

feature.options <- c("UTR length", "total RBP", "Counts AREs", "Codon Optimality", "m6A enrichment")

ui <- fluidPage(
  titlePanel("Feature distributions"),
  theme = shinytheme("sandstone"),
  sidebarLayout(
    sidebarPanel(
      selectInput("feature", "Which feature do you want to analyze?", choices = feature.options) # 修正参数名:choice → choices
    ),
    mainPanel(
      plotOutput("plot")
    )
  )
)
server <- function(input, output, session) {
  output$plot <- renderPlot({
    Matrix.PV.mRNA.destab %>%
      group_by(status) %>%
      ggplot(aes(x = .data[[input$feature]], fill = status)) + 
      geom_density(color = "black") +
      theme_classic() +
      theme(axis.text = element_text(size = 14),
            axis.title = element_text(size = 14)) +
      labs(x = input$feature) # 手动设置x轴标题,避免显示.data[[input$feature]]
  })
}

shinyApp(ui, server)

方案2:使用tidyeval语法(sym() + !!)

通过符号解析和非标准求值来实现:

# 在server的renderPlot中替换aes部分
ggplot(aes(x = !!sym(input$feature), fill = status))

方案3:使用旧版aes_string()(不推荐,但兼容旧代码)

aes_string()专门接收字符串形式的参数,但目前已被tidyeval方法替代:

# 在server的renderPlot中替换aes部分
ggplot(aes_string(x = input$feature, fill = "status")) # fill参数也要传字符串

额外注意:原代码中selectInput的参数写错了,应该是choices而非choice;同时要确保shinythemes包已安装并加载,否则主题设置会报错。

内容的提问来源于stack exchange,提问作者Mauricio Oliveira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 16:56:26