【问题标题】:Accumulate changes in data frame in Shiny app in R在 R 中的 Shiny 应用程序中累积数据帧的变化
【发布时间】:2022-11-04 07:24:57
【问题描述】:

我正在构建一个闪亮的应用程序,我希望用户能够通过按下按钮写下对数据框的更改,并且我希望这些更改被存储并在数据框中可用。例如:

    library("shiny")
    
    data <- as.data.frame(diamonds)
    data$comment <- NA
    
    toChange <- data
    
    ui <- fluidPage(
      selectInput(inputId = "cut", 
                  label = "Select Cut", 
                  choices = unique(diamonds$cut), 
                  selected = "Ideal"),
      actionButton(inputId = "price", 
                   label = "Write new price"),
      DTOutput("tabOut")
      
    )
    
    server <- function(input,session, output) {
     
       observeEvent(input$price, {
        toChange[toChange$cut == input$cut, "price"] <- toChange[toChange$cut == input$cut, "price"] * 3
        toChange[toChange$cut == input$cut, "comment"] <- paste0("updated: ", Sys.time())
        
        output$tabOut <- renderDT({
          toChange
        }, filter = "top")
      })
      
      observeEvent(req(input$price == 0), {
        output$tabOut <- renderDT({
          data
        }, filter = "top")
      })
      
      observeEvent(input$price, {
       
      })

    }
    
   shinyApp(ui = ui, server = server)

在这种情况下,当我运行应用程序并按下“写入新价格”按钮时,我只会将它用于“剪切”选择器中最后选择的选项。但我希望它保留之前选择的值。

【问题讨论】:

    标签: r shiny shiny-reactivity


    【解决方案1】:

    我们可以将更改后的数据集存储在reactiveValues 中,并在用户每次单击按钮时对其进行更新。

    library("shiny")
    library(DT)
    data <- as.data.frame(ggplot2::diamonds)
    data$comment <- NA
    
    ui <- fluidPage(
        selectInput(inputId = "cut", 
                    label = "Select Cut", 
                    choices = unique(ggplot2::diamonds$cut), 
                    selected = "Ideal"),
        actionButton(inputId = "price", 
                     label = "Write new price"),
        DTOutput("tabOut")
        
    )
    
    server <- function(input,session, output) {
        
        toChange <- reactiveValues(df = data)
        observeEvent(input$price, {
            toChange$df[toChange$df$cut == input$cut, "price"] <- toChange$df[toChange$df$cut == input$cut, "price"] * 3
            toChange$df[toChange$df$cut == input$cut, "comment"] <- paste0("updated: ", Sys.time())
            
            output$tabOut <- renderDT({
                toChange$df
            }, filter = "top")
        })
        
        observeEvent(req(input$price == 0), {
            output$tabOut <- renderDT({
                data
            }, filter = "top")
        })
        
        
    }
    
    shinyApp(ui = ui, server = server)
    

    【讨论】:

      猜你喜欢
      • 2017-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 2019-01-08
      • 2019-05-21
      • 2021-12-19
      相关资源
      最近更新 更多