使用Shiny控件动态选变量检验线性度时遇长度不匹配错误
问题原因
错误variable lengths differ (found for 'input$var')的核心原因是:plot()的公式参数中,input$var是字符串类型(比如选择"carat"时,它是字符串"carat"),R会将其视为长度为1的常量向量,而diamonds$price是近5.4万行的向量,两者长度不匹配,因此触发报错。
解决方案
以下三种修复方式任选其一即可:
方法1:用reformulate()生成公式
reformulate()可直接将字符串转换为回归公式,指定响应变量为"price":
server <- function(input, output,session) { output$hist<-renderPlot({ plot(reformulate(input$var, response = "price"), data=diamonds) }) }
方法2:用as.formula()拼接公式字符串
手动拼接公式字符串后转换为公式对象:
server <- function(input, output,session) { output$hist<-renderPlot({ plot(as.formula(paste("price ~", input$var)), data=diamonds) }) }
方法3:直接提取数据列绘图
绕过公式语法,用数据框索引直接提取变量:
server <- function(input, output,session) { output$hist<-renderPlot({ plot(diamonds[[input$var]], diamonds$price, xlab = input$var, ylab = "price") }) }
完整可运行代码示例
以方法1为例,注意需加载ggplot2包(diamonds数据集属于该包):
## app.R ## library(shiny) library(shinydashboard) library(shinyjs) library(htmlwidgets) library(ggplot2) ui <- dashboardPage( dashboardHeader( title="Task Managers' Workload Analysis", titleWidth = 400 ), dashboardSidebar( selectInput("var","Select variable",choices = colnames(diamonds),selected = colnames(diamonds)[1]) ), dashboardBody( plotOutput("hist") ) ) server <- function(input, output,session) { output$hist<-renderPlot({ plot(reformulate(input$var, response = "price"), data=diamonds) }) } shinyApp(ui, server)
内容的提问来源于stack exchange,提问作者firmo23
相关产品推荐
相关产品推荐

