ShinyDashboard动态绘图报错求助:x与y长度不一致
解决Shiny绘图中x和y长度不匹配的问题
这个错误的原因很直观:你在renderPlot里直接用input$filter(这是个字符串,比如选"mpg"时它就是长度为1的字符向量)和y绘图,而y是mtcars$vs,长度是32,两者长度完全不匹配,R自然会抛出xy.coords的报错。
修复核心思路
把字符串形式的变量名,转换成对应的数据列就行——用双中括号[[ ]]从数据框里按字符串提取目标列,这样得到的x向量就和y长度一致了。
修改后的完整代码
library(shiny) library(shinydashboard) data("mtcars") y <- mtcars$vs X <- mtcars[ , !(names(mtcars) %in% "vs")] header_app <- dashboardHeader() sidebar_app <- dashboardSidebar() body_app <- dashboardBody( fluidRow( box( selectInput("filter", "选择X变量", choices = names(X)), plotOutput("plot1", height = "250") ) #box ) #Fluid Row ) ui <- dashboardPage(header = header_app, sidebar = sidebar_app, body = body_app) server <- function(input,output){ output$plot1 <- renderPlot({ # 关键修改:用X[[input$filter]]获取对应列,而非直接用input$filter字符串 plot(x = X[[input$filter]], y = y, xlab = input$filter, ylab = "vs", main = paste(input$filter, " vs vs")) }) } shinyApp(ui,server)
额外小优化(可选)
其实你也不用提前拆分mtcars,直接在server里调用原数据集的列,代码会更简洁:
# server部分可以改成这样 server <- function(input,output){ output$plot1 <- renderPlot({ plot(x = mtcars[[input$filter]], y = mtcars$vs, xlab = input$filter, ylab = "vs", main = paste(input$filter, " vs vs")) }) }
这样修改后,选中任意X变量都会生成对应的散点图,x和y长度匹配,就不会再报错啦。
内容的提问来源于stack exchange,提问作者Nicolas Physentzides
相关产品推荐
相关产品推荐

