R Shiny报错`x` must contain exactly 1 expression, not 2的原因与解决
R Shiny 动态标签页+多图布局报错:
x must contain exactly 1 expression, not 2 错误原因分析
- 变量引用错误:在内层
renderPlotly中,错误使用全局的input$y而非当前循环的y变量,导致图表绑定了所有选中的Y变量,而非当前标签页对应的单个Y变量。 - UI元素构造错误:生成多列布局时,直接将
lapply返回的列表传入fluidRow,但fluidRow要求接收单个表达式或多个独立子元素,列表形式会被识别为多个表达式引发错误。 - 列表索引错误:使用单括号
[x]访问图表列表元素,返回的是子列表而非单个图表对象,导致UI组件无法正确解析。
解决方法
- 将
renderPlotly中的y = input$y改为y = y,绑定当前循环的Y变量 - 使用
do.call(fluidRow, ...)将lapply生成的列元素列表作为参数传递给fluidRow,确保参数格式符合Shiny要求 - 访问图表元素时使用双括号
[[x]],取出单个图表对象而非子列表
修正后的完整代码
library(shiny) library(ggplot2) library(plotly) library(dplyr) ui <- fluidPage( sidebarLayout( sidebarPanel( selectizeInput(inputId = "y", label = "Y", choices = names(mtcars), selected = names(mtcars)[1:2], multiple = T), selectizeInput(inputId = "xvars", label = "X", choices = names(mtcars), selected = names(mtcars)[1:3], multiple = T) ), mainPanel(uiOutput("allplots")) ) ) server <- function(input, output, session) { output$allplots <- renderUI({ # 生成每个Y变量对应的所有X变量图表 plots <- lapply(input$y, function(y){ lapply(input$xvars, function(x){ renderPlotly({ mtcars %>% ggplot(aes_string(x = x, y = y)) + geom_point() }) }) }) names(plots) <- input$y # 为每个Y变量构造两列布局的UI plotarrange <- lapply(input$y, function(y){ if (length(input$xvars) == 1) { fluidRow(column(12, plots[[y]][[1]])) } else { # 用do.call将lapply生成的列列表转为fluidRow的参数 do.call(fluidRow, lapply(1:length(input$xvars), function(x) { column(6, plots[[y]][[x]]) })) } }) names(plotarrange) <- input$y # 构造标签页集合 do.call(tabsetPanel, c(id='tab', lapply(input$y, function(y) { tabPanel( title = paste0('tab ', y), plotarrange[[y]] ) }))) }) } shinyApp(ui, server)
内容的提问来源于stack exchange,提问作者Abbas
相关产品推荐
相关产品推荐

