【问题标题】:How avoid "invalid (NULL) left side of assignment" error in R Shiny app?如何避免 R Shiny 应用程序中的“分配的无效(NULL)左侧”错误?
【发布时间】:2021-10-21 22:35:55
【问题描述】:

我有一个数据集,想创建一个带有 if 条件的 R Shiny 应用程序(基于 RadioButton)。 此外,过滤我的初始数据集后,我想将Quantity 列中的所有2 值替换为200(是的,可以在server() 之外进行,但就我而言,有必要在里面做)。 我总是在这里出错sales_by_mfr()$Quantity <- reactive(ifelse(sales_by_mfr()$Quantity == 2,200,sales_by_mfr()$Quantity))

此外,我尝试用 sales_by_mfr()[sales_by_mfr() == 2] <- reactive({200}) 替换我的数据集中的所有 2 值,但是得到了同样的错误。 您能否帮助找到一种方法来避免此代码中出现“无效(NULL)左侧赋值”错误?

library(dplyr)
library(shiny)

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(
      #sliderInput
      
      radioButtons("dist", "Data:",
                   c("The most recent" = "most_recent",
                     "Historical" = "historical"))
    ),
    
    # plot graphs
    mainPanel(tabsetPanel(
      tabPanel("Plot", 
               h3(helpText("Nordpool prices")),
               #plotOutput("plot"),
               reactableOutput("table")
               #h3(helpText("Descr.statistics")),
               #verbatimTextOutput("Descr.stat.price")
      )
    )
    ))

)
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))
    }
    
  })
  
  
  sales_by_mfr()$Quantity <- reactive(ifelse(sales_by_mfr()$Quantity == 2,200,sales_by_mfr()$Quantity))

  #sales_by_mfr()[sales_by_mfr() == 2] <- reactive({200})
  
  
  
  #Create columns in two rows (1-dat,2-diffs)
  
  
  output$table <- renderReactable({
    reactable(
      sales_by_mfr(),#
      # columns = columns(),columnGroups = columnGroups()
      #defaultColDef = colDef(minWidth = 222,vAlign = "center"),
      #defaultColDef = colDef(vAlign = "center", headerVAlign = "bottom"),
      
      # Set a maximum width on the table:
      #style = list(maxWidth = 650),
      # Or a fixed width:
      #width = 650,
      
    )
  })
}

shinyApp(ui = ui, server = server)

【问题讨论】:

  • 在响应式中尝试ifelse(data$Quantity == 2,200,data$Quantity)。

标签: r shiny


【解决方案1】:

试试这个

library(MASS)
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)) %>%
  dplyr::select(ID, Date, Manufacturer, Model, Type, Price)

ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      #sliderInput
      
      radioButtons("dist", "Data:",
                   c("The most recent" = "most_recent",
                     "Historical" = "historical"))
    ),
    
    # plot graphs
    mainPanel(tabsetPanel(
      tabPanel("Plot", 
               h3(helpText("Nordpool prices")),
               #plotOutput("plot"),
               reactableOutput("table")
               #h3(helpText("Descr.statistics")),
               #verbatimTextOutput("Descr.stat.price")
      )
    )
    ))
  
)
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))
    }
    ifelse(data$Quantity == 2,200,data$Quantity)
    data
  })
  
  
  #sales_by_mfr()$Quantity <- reactive(ifelse(sales_by_mfr()$Quantity == 2,200,sales_by_mfr()$Quantity))
  
  #sales_by_mfr()[sales_by_mfr() == 2] <- reactive({200})
  
  
  #Create columns in two rows (1-dat,2-diffs)
  
  
  output$table <- renderReactable({
    reactable(
      sales_by_mfr(),#
      # columns = columns(),columnGroups = columnGroups()
      #defaultColDef = colDef(minWidth = 222,vAlign = "center"),
      #defaultColDef = colDef(vAlign = "center", headerVAlign = "bottom"),
      
      # Set a maximum width on the table:
      #style = list(maxWidth = 650),
      # Or a fixed width:
      #width = 650,
      
    )
  })
}

shinyApp(ui = ui, server = server)

【讨论】:

  • 是的,它正在工作。你能解释一下为什么如果把它放在if 条件下的反应函数中,它为什么会起作用,但是,如果把一个单独的行也放在反应函数中,那么它就不起作用?就我而言,我更愿意将其放在if 条件之外,但如果不可能,则需要了解其背后的逻辑。
  • 你不能在外面修改。也许您应该阅读更多关于reactive 和reactiveValues 对象之间的差异的内容。
猜你喜欢
  • 2019-09-18
  • 1970-01-01
  • 2020-08-02
  • 2019-07-31
  • 2013-10-01
  • 2017-11-08
  • 2018-10-24
  • 1970-01-01
  • 2017-12-30
相关资源
最近更新 更多