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

如何避免R Shiny应用出现“invalid (NULL) left side of assignment”错误

报错原因
  • Shiny的reactive对象本质是响应式函数,调用sales_by_mfr()得到的是临时返回的数据集,不支持直接作为赋值语句的左值,这是你报错的核心原因
  • 不需要将列修改逻辑额外嵌套一层reactive()写在赋值语句中,属于错误用法
解决方法

以下两种实现都满足「在server内部完成Quantity值替换」的要求:

方法1:直接在原有reactive逻辑中增加修改步骤

在sales_by_mfr的聚合逻辑后直接新增修改列的步骤,无需额外写赋值语句:

library(dplyr)
library(shiny)
library(reactable)

data <- MASS::Cars93[18:47, ] %>%
  mutate(ID = as.character(18:47), Date = seq(as.Date("2019-01-01"), by = "day", length.out = 30)) %>%
  select(ID, Date, Manufacturer, Model, Type, Price)


ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      radioButtons("dist", "Data:",
                   c("The most recent" = "most_recent",
                     "Historical" = "historical"))
    ),
    mainPanel(tabsetPanel(
      tabPanel("Plot", 
               h3(helpText("Nordpool prices")),
               reactableOutput("table")
      )
    )
    ))
  
)
server <- function(input, output, session) {
  
  sales_by_mfr<-reactive({
    # 先按单选框逻辑计算原始聚合结果
    raw_agg <- if (input$dist == "most_recent"){
      data %>%
        filter(Manufacturer %in% c("Chevrolet","Hyundai","Honda"))  %>% 
        group_by(Manufacturer) %>%
        summarize(Quantity = n(), Sales = sum(Price))
    }else{
      data %>%
        group_by(Manufacturer) %>%
        summarize(Quantity = n(), Sales = sum(Price))
    }
    # 内部完成Quantity值替换
    raw_agg %>% 
      mutate(Quantity = ifelse(Quantity == 2, 200, Quantity))
  })
  
  output$table <- renderReactable({
    reactable(
      sales_by_mfr()
    )
  })
}

shinyApp(ui = ui, server = server)

方法2:新增独立响应式对象承接修改后的数据

如果你需要保留原始的聚合结果做其他业务操作,可以新建一个单独的响应式变量处理修改逻辑:

server <- function(input, output, session) {
  
  sales_by_mfr<-reactive({
    if (input$dist == "most_recent"){
      data %>%
        filter(Manufacturer %in% c("Chevrolet","Hyundai","Honda"))  %>% 
        group_by(Manufacturer) %>%
        summarize(Quantity = n(), Sales = sum(Price))
    }else{
      data %>%
        group_by(Manufacturer) %>%
        summarize(Quantity = n(), Sales = sum(Price))
    }
  })
  
  # 新增响应式对象处理值替换
  modified_sales <- reactive({
    sales_by_mfr() %>% 
      mutate(Quantity = ifelse(Quantity == 2, 200, Quantity))
  })
  
  output$table <- renderReactable({
    reactable(
      modified_sales()
    )
  })
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:36:03