如何避免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
相关产品推荐
相关产品推荐

