Change cells based on modifications of other cells in rhandsontable of a shiny app

前端 未结 1 1169
不思量自难忘°
不思量自难忘° 2021-01-25 19:21

I am trying to build a shiny app with rhandsontable in it. This rhandsontable is based on the datframe I create inside the app.

In the app I initially display the first

相关标签:
1条回答
  • 2021-01-25 19:52

    In the code that you have added for retrieving the value selected in second column, we would need to update something.

    if(col==0){
             values$postcode <- input$test$changes$changes[[1]][[4]]
             #values$car_group<-input$test$changes$changes[[1]][[4]]
          }
    

    Index of handsontable starts with 0. So, its 0 for first column and 1 for second column, meaning you cannot update the values to car_group reactive variable within the if condition for the first column

    A solution to your current question based on the answer that I provided here. Update rhandsontable by changing one cell value

    library(shiny)
    library(rhandsontable)
    
    
    ui <- fluidPage(
    
       titlePanel("RHandsontable"),
       sidebarLayout(
          sidebarPanel(),
          mainPanel(
             rHandsontableOutput("test")
          )
       )
    )
    
    
    server <- function(input, output) {
    
      # Assigning blank values to reactive variable as all the values need to be listed first
      values <- reactiveValues(postcode = "",cargroup = "",tabledata = data.frame())
    
      observeEvent(values$postcode,{
        DF2 = data.frame(agency_postcode = factor(rep(c(12345,45678,24124,32525,32325),2)),
                         car_group=factor(rep(c("Microcar","City car","Supermini","Compact","SUV"),2)),
                         transmission=factor(rep(c("automatic","manual"),5)))
        # When the user selects any value from the dropdown, filter the table and update the value of reactive df
        if(values$postcode!=""){
          values$tabledata <- DF2[ which(DF2$agency_postcode ==values$postcode), ]
        }else{
          # When the postcode value is blank, meaning the user hasn't selected any, the table 
          # will render without the third column
          values$tabledata <- DF2[,-3]
        }
    
      })
    
      observeEvent(values$cargroup,{
        DF2 = data.frame(agency_postcode = factor(rep(c(12345,45678,24124,32525,32325),2)),
                         car_group=factor(rep(c("Microcar","City car","Supermini","Compact","SUV"),2)),
                         transmission=factor(rep(c("automatic","manual"),5)))
        values$tabledata <- DF2
        # When the user selects any value from the dropdown, filter the table and update the value of reactive df
        if(values$cargroup!=""){
          values$tabledata <- DF2[ which(DF2$car_group ==values$cargroup), ]
        }else{
          # When the cargroup value is blank, meaning the user hasn't selected any, the table 
          # will render without the third column
          values$tabledata <- DF2[,-3]
        }
    
      })
    
      # Observer for changes made to the hot
      observeEvent(input$test$changes$changes,{
        col <- input$test$changes$changes[[1]][[2]]
        # Changes made in first column
        if(col==0){
          values$postcode <- input$test$changes$changes[[1]][[4]]
        }
        # Changes made in second column
        if(col==1){
          values$cargroup <- input$test$changes$changes[[1]][[4]]
        }
      })
    
      # Render the hot object
      output$test <- renderRHandsontable({
        rhandsontable(values$tabledata[1,], rowHeaders = NULL, width = 550, height = 300)%>%
          hot_col(colnames(values$tabledata)) 
      })
    
    
    }
    
    shinyApp(ui = ui, server = server)
    

    Check if this suits your needs. You can then update the observer part based on search button instead of being reactive to the changes made by user.

    0 讨论(0)
提交回复
热议问题