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

Shiny开发遇赋值左侧无效(NULL)错误,求数据框处理与绘图方案

解决Shiny应用中的「Invalid (NULL) left side of assignment」错误与需求实现

嘿,我刚仔细看了你的代码和需求,咱们先把导致错误的核心问题理清楚,再一步步修正,同时实现你想要的两个功能:

核心错误分析

你遇到的「Invalid (NULL) left side of assignment」错误主要来自这几个地方:

  • Reactive变量使用错误:调用Shiny的reactive对象必须加括号(比如df()而不是df),但你写了ndf() <- ...和dataset() <- df这种不符合规则的赋值方式。
  • Reactive返回值错误:你的df reactive最后返回的是上传的文件对象inFile,而不是读取后的数据集df,导致后续拿不到正确的数据框。
  • UI布局混乱:radioButtons被放在了sidebarLayout外面,破坏了Shiny的布局逻辑,组件无法正常渲染。

修正后的完整代码

下面是修复所有问题并实现你需求的完整代码:

library(readxl)
library(shiny)
library(ggplot2)
library(dplyr)

# Define UI for application that draws a histogram
ui <- fluidPage(
    # Application title
    titlePanel("Data Quality Result Monitoring"),

    # Sidebar with inputs
    sidebarLayout(
        sidebarPanel(
            fileInput('file1', 'Choose xlsx file', accept = c(".xlsx")),
            radioButtons("disp", "Display Data:", 
                         choices = c(Head = "head", All = "all"), 
                         selected = "head")
        ),
        # Main panel with outputs
        mainPanel(
            h4("Observations"),
            tableOutput("contents"),
            h4("Status Count by Date"),
            plotOutput("statusPlot")
        )
    )
)

# Define server logic
server <- function(input, output) {

    # Reactive data frame: read uploaded file
    df <- reactive({
        inFile <- input$file1
        if (is.null(inFile)) return(NULL)
        # 读取Excel文件,返回数据框
        read_xlsx(inFile$datapath, sheet = 1)
    })

    # 输出数据表格(head或全部)
    output$contents <- renderTable({
        req(df())  # 确保数据上传后再执行
        dataset <- df()
        if(input$disp == "head") {
            head(dataset)
        } else {
            dataset
        }
    })

    # 输出按日期分组的status统计图表
    output$statusPlot <- renderPlot({
        req(df())  # 等待数据上传
        # 按日期和status分组统计数量
        status_summary <- df() %>%
            group_by(Execution_Date, status) %>%
            summarize(count = n(), .groups = "drop")
        
        # 绘制分组柱状图(要折线图的话换geom_line+geom_point即可)
        ggplot(status_summary, aes(x = Execution_Date, y = count, fill = status)) +
            geom_col(position = "dodge") +
            labs(x = "Execution Date", y = "Count", fill = "Status") +
            theme(axis.text.x = element_text(angle = 45, hjust = 1))  # 旋转日期标签避免重叠
    })
}

# Run the application
shinyApp(ui = ui, server = server)

关键修正点说明

  1. Reactive数据处理:
    • 修正了df reactive的返回值,现在正确返回读取后的数据集。
    • 用req(df())确保只有用户上传文件后,后续逻辑才会执行,避免NULL值报错。
  2. UI布局修复:把radioButtons移到了sidebarPanel内,保证布局符合Shiny规范。
  3. 表格输出逻辑:去掉错误的dataset() <- df写法,直接将reactive数据赋值给普通变量,再根据用户选择返回head或全部数据。
  4. 统计绘图功能:
    • 按照Execution_Date和status分组统计数量,完美匹配你对二元列的统计需求。
    • 用geom_col做分组柱状图,如果想要折线图,替换成geom_line(aes(group = status)) + geom_point()就行。
    • 添加了日期标签旋转,避免x轴标签挤在一起。

额外小提示

  • 确保你的Excel数据里确实有Execution_Date(日期格式)和status(取值为Pass/Fail)这两列,不然代码会报错哦。
  • 如果需要按周/月统计,可以在group_by前用mutate(Execution_Date = floor_date(Execution_Date, "week"))(需要加载lubridate包)来调整日期粒度。

内容的提问来源于stack exchange,提问作者Dhruv

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:32:16