如何在Shiny绘图中让用户选择x_var?代码报错求助
问题分析
你遇到的错误是因为TD$x_var的写法逻辑错误——R会把它当成数据框TD中**列名为"x_var"**的字段,但实际上x_var是存储用户选择的列名字符串的变量,这种硬编码方式无法动态匹配用户选中的列。
修正方案
推荐使用ggplot2官方推荐的.data代词来动态引用变量,同时规范ggplot的数据传入方式,具体修正如下:
修正后的完整代码
TD <- thyroid library(readxl) library(shiny) library(ggplot2) library(shinythemes) library(DT) ui <- shinyUI(fluidPage(pageWithSidebar( headerPanel("Test App"), sidebarPanel( # 给selectInput设置默认选中项,避免初始状态x_var为空 selectInput("xaxis", "Choose a x variable", choices = names(TD), selected = names(TD)[1]), actionButton("goButton","Update") ), mainPanel( tabsetPanel( tabPanel('Plot', plotOutput("plot1")) )) ) )) server <- shinyServer(function(input,output, session){ x_var <- eventReactive(input$goButton, { input$xaxis }, ignoreNULL = FALSE) # 确保初始状态也能获取默认列名 output$plot1 <- renderPlot({ x <- x_var() # 1. 将TD传入ggplot的data参数,简化aes中的列引用 # 2. 用.data[[x]]动态提取选中的列 p <- ggplot(data = TD) + geom_bar(aes(x = .data[[x]], fill = ThryroidClass)) p }) }) shinyApp(ui,server)
关键修正点
- 动态变量引用:用
.data[[x]]替代TD$x_var,.data是ggplot2提供的代词,能根据字符串变量动态提取数据框中的对应列。 - 数据传入规范:将
TD作为ggplot()的data参数传入,这样aes里可以直接写列名(或动态引用),无需重复写TD$。 - 避免初始空值:给
selectInput设置selected默认值,同时给eventReactive加ignoreNULL = FALSE,确保应用启动时就能生成初始图表,不会因为x_var()为空报错。
兼容旧版本方案(aes_string)
如果使用的是较旧版本的ggplot2,也可以用aes_string函数直接传入字符串变量:
p <- ggplot(data = TD) + geom_bar(aes_string(x = x, fill = "ThryroidClass"))
不过.data代词是ggplot2 3.0.0+推荐的更清晰写法,优先使用前者。
内容的提问来源于stack exchange,提问作者souhail Lyamani
相关产品推荐
相关产品推荐

