如何解决Shiny中Warning: Error in if: argument is of length zero报错
Shiny蜘蛛图选择组件报错:Warning: Error in if: argument is of length zero
报错原因
应用初始化阶段,renderPlotly会优先执行,但此时通过uiOutput生成的input$selected_plot_trt还未完成渲染,导致该输入值长度为0,直接用于!= "All"的比较会触发警告。此外,服务器端的plot_data在renderPlotly中被直接重新赋值,不符合Shiny响应式编程规范,可能引发潜在逻辑问题。
解决方法
1. 确保输入值存在后再执行逻辑
在图表渲染逻辑开头添加req(input$selected_plot_trt),强制等待输入值生成后再执行后续代码。
2. 给选择框设置默认值
在selectInput中指定selected = "All",让应用初始化时就拥有合法的输入值,避免空值判断报错。
3. 使用响应式变量处理数据
将数据过滤逻辑封装到reactive变量中,避免直接覆盖全局变量,让代码逻辑更清晰且符合Shiny响应式机制。
修改后的完整代码
ui.R
library("dplyr") library("haven") library("tidyverse") library("ggplot2") library("plotly") df <- data.frame( SUBJID = c("101-001", "101-001", "101-001", "101-001", "101-001", "101-002", "101-002", "101-006", "101-006", "101-007", "101-007", "302-001", "302-001", "303-001", "303-001", "303-001"), ADY = c(-4, 37, 78, 121, 163, -7, 41, -20, 38, -7, 42, -10, 42, -14, 41, 78), PCHG = c(0, 0, -12.444523, -12.444322, -25.482626, 0, 15.789474, 0, -3.22666, 0, 7.55533, 0, 18.076923, 0, -2.53434, 22.666667), TRTA = c("6mg", "6mg", "6mg", "6mg", "6mg", "12mg", "12mg", "24mg", "24mg", "24mg", "24mg", "40mg", "40mg", "40mg", "40mg", "40mg"), TRTAN = c(11, 11, 11, 11, 11, 12, 12, 14, 14, 14, 14, 15, 15, 15, 15, 15), BOR = c("PR", "PR", "PR", "PR", "PR", "PD", "PD", "PD", "PD", "SD", "SD", "PD", "PD", "SD", "SD", "SD") ) shinyUI(navbarPage( "Patient Profiles", tabPanel( "Spider Plot", fluidPage( uiOutput("selected_plot_trt"), plotlyOutput("plot", height = 800, width = 1800) ) ), collapsible = TRUE ))
server.R
library("dplyr") library("haven") library("tidyverse") library("ggplot2") library("plotly") df <- data.frame( SUBJID = c("101-001", "101-001", "101-001", "101-001", "101-001", "101-002", "101-002", "101-006", "101-006", "101-007", "101-007", "302-001", "302-001", "303-001", "303-001", "303-001"), ADY = c(-4, 37, 78, 121, 163, -7, 41, -20, 38, -7, 42, -10, 42, -14, 41, 78), PCHG = c(0, 0, -12.444523, -12.444322, -25.482626, 0, 15.789474, 0, -3.22666, 0, 7.55533, 0, 18.076923, 0, -2.53434, 22.666667), TRTA = c("6mg", "6mg", "6mg", "6mg", "6mg", "12mg", "12mg", "24mg", "24mg", "24mg", "24mg", "40mg", "40mg", "40mg", "40mg", "40mg"), TRTAN = c(11, 11, 11, 11, 11, 12, 12, 14, 14, 14, 14, 15, 15, 15, 15, 15), BOR = c("PR", "PR", "PR", "PR", "PR", "PD", "PD", "PD", "PD", "SD", "SD", "PD", "PD", "SD", "SD", "SD") ) shinyServer(function(input, output, session){ # 预处理基础数据 base_data <- df %>% select(SUBJID, ADY, PCHG, TRTA, TRTAN, BOR) %>% arrange(TRTAN) # 生成选择框,设置默认值为All output$selected_plot_trt <- renderUI({ selectInput("selected_plot_trt", "Treatment Group", choices = c("All", unique(sort(as.character(base_data$TRTA)))), selected = "All") }) # 响应式处理过滤后的数据 filtered_data <- reactive({ req(input$selected_plot_trt) # 确保输入存在 if (input$selected_plot_trt != "All") { base_data[base_data$TRTA == input$selected_plot_trt, ] } else { base_data } }) # 生成图表 output$plot <- renderPlotly({ ggplotly( ggplot(filtered_data(), aes(x = ADY, y = PCHG, group = SUBJID, color=reorder(TRTA, TRTAN))) + theme_bw(base_size=12) + ggtitle("Percent Change in Tumor from Baseline over Time") + theme(plot.title = element_text(hjust = 0.5)) + xlab("Analysis Relative Day") + ylab("Percent Change from Baseline") + geom_line() + geom_point(aes(shape = BOR, color=BOR), size = 2) + scale_color_manual(name="", values = c("6mg" = "#B03060", "12mg" = "#d62728", "24mg" = "#2ca02c","40mg" = "#ffbb78"), breaks = c("6mg", "12mg", "24mg", "40mg"), labels = c("6mg", "12mg", "24mg", "40mg")) + scale_shape_manual(name = "", breaks = c("CR", "PR", "SD", "PD", "NA"), values = c("SD"=16, "PD"=4, "PR"=18, "CR"=17, "NA"=4), labels=c("CR"="Complete Response", "PR"="Partial Response", "SD"="Stable Disease", "PD"="Progressive Disease", "NA"="Not Available")) ) }) })
内容的提问来源于stack exchange,提问作者BingZhizhi
相关产品推荐
相关产品推荐

