You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 04:45:57