Shiny中radioButtons切换fmsb雷达图触发lwd参数无效报错问题
报错成因
fmsb包的radarchart()函数对输入数据有强制格式要求:输入数据框必须以各维度最大值行、各维度最小值行作为前2行,从第3行开始才是待可视化的样本数据。你的代码在server端筛选待展示英雄时,仅提取了对应英雄的单行数据,未保留必需的max、min基准行,完全不符合函数输入规范。- R默认会将数据框单行提取的结果降维为原子向量,而非保留数据框结构,导致函数内部解析线宽参数(
plwd/底层绘图的lwd)时长度匹配失败,最终抛出invalid value specified for graphical parameter "lwd"报错。 - 你代码中设置的
plwd = 0.5本身没有语法问题,并非参数值非法触发报错。
修复方法
修改server端的数据筛选逻辑,每次构造绘图数据集时,必须保留前2行max、min基准值,再拼接选中的英雄数据,同时添加drop = FALSE参数防止数据框降维。
修复后的完整可运行代码如下:
library(fmsb) data<-data.frame(Strength = c(7, 0, 6, 7, 4, 3), Speed = c(7, 0 , 5, 7, 3, 2), Intelligence = c(7, 0, 6, 2, 4, 3), Fighting_Skills = c(7, 0, 4, 4, 4, 6), Energy = c(7, 0, 6, 6, 1, 1), Durability = c(7, 0, 6, 6, 3, 3), row.names = c("max", "min", "Iron Man", "Thor", "Spiderman", "Captain America")) colors_fill<-c(scales::alpha("gray", 0.1)) colors_line<-c(scales::alpha("darkgray", 0.9)) ui <- fluidPage( titlePanel("Radar chart"), sidebarLayout( sidebarPanel( radioButtons("variablechoice", "People Choice", choices = c("Iron Man", "Thor", "Spiderman", "Captain America"), selected = "Thor") ), mainPanel( plotOutput("radar") ) ) ) server <- function(input, output) { output$radar <- renderPlot({ # 匹配选中英雄对应的行号 hero_idx <- switch (input$variablechoice, "Iron Man" = 3, "Thor" = 4, "Spiderman" = 5, "Captain America" = 6 ) # 拼接max、min基准行和目标英雄行,禁止降维 plot_data <- data[c(1,2, hero_idx), , drop = FALSE] radarchart(plot_data, seg = 7, pcol = colors_line, pfcol = colors_fill, plwd = 0.5) }) } shinyApp(ui = ui, server = server)
运行上述代码后,切换单选按钮即可正常展示对应超级英雄的多维属性雷达图,不会再触发lwd参数相关报错。
内容的提问来源于stack exchange,提问作者IER
相关产品推荐
相关产品推荐

