Get selected rows of Rhandsontable

前端 未结 2 1812
Happy的楠姐
Happy的楠姐 2020-12-09 19:45

I am using rhandsontable in a Shiny App and I would like to know how to use the getSelected() method of Handsontable in this case, as I intend to apply changes on the data.f

2条回答
  •  死守一世寂寞
    2020-12-09 20:38

    While rhandsontable is a real good implementation of handsontable (credit goes to @jrowen), currently it does not include getSelected().

    The event of a user altering any cell (including selecting / deselecting a checkbox) is tracked by shiny. This gives the opportunity to use checkboxes to let the user to select (or de-select) one or more rows.

    Unfortunately the logic to understand what has been selected needs to be developed on the server side by your code.

    The snippet of code below may give you some idea on how to manage it.

    options(warn=-1)
    library(rhandsontable)
    library(shiny)
    
    options(warn=-1)
    quantity <- id <- 1:20
    label <- paste0("lab","-",quantity)
    pick <- FALSE
    iris_ <- data.frame(id=id,pick=pick, quantity=quantity,label=label,iris[1:20,] ,stringsAsFactors = FALSE)
    mtcars_ <- data.frame(id=id,pick=pick, quantity=quantity,label=label,mtcars[1:20,] ,stringsAsFactors = FALSE)
    iris_$Species <- NULL #  i.e.  no factors
    #---------------------------
    ui <- fluidPage(
        fluidRow(
            column(6,rHandsontableOutput('demTb')),
            column(3,uiOutput("demSli")),
        column(3, radioButtons("inButtn", label=NULL, choices= c("iris","mtcars"), selected = "iris", inline = TRUE))
            )
        )
    
    server <- function(session, input, output) {
    
    selData <- ""
    
    
    output$demSli <- renderUI({
    
    if(is.null(input$demTb) ) return()
    
    isolate({
    df_ <- hot_to_r(input$demTb)
    index <- which(df_$pick==T)
    if(length(index)==0) return()
    labs <- iris_$label[index] 
    pages <- "test"
    iter <- length(labs)
    buttn <- 1
    valLabs <- sapply(1:iter, function(i) {
    if(is.null(input[[paste0(pages,"d",labs[i],buttn)]] )) {
              0
    } else {  as.numeric(input[[paste0(pages,"d",labs[i],buttn)]])  }
    }) 
    #
    toRender <- lapply(1:iter, function(i) {
      sliderInput(inputId = paste0(pages,"d",labs[i],buttn),
                  label =  h6(paste0(labs[i],"")),
                  min = -100,
                  max = 100,
                  step = 1,
                  value = valLabs[i],
                  post="%",
                  ticks = FALSE, animate = FALSE)
                  })
    })
          return(toRender)
    
    })
    #--------------------
    rds <- reactive({
    
      # if( is.null(input$demTb) ) {
      if( input$inButtn == "iris") { 
          if(selData == "" | selData == "mtcars") {
             selData <<- "iris"
    
            return(iris_) # first time for iris
          }
      } else {
          if(selData == "iris" ) {
             selData <<- "mtcars"
    
            return(mtcars_) # first time for mtcars
          }
        }
    
    df_ <- hot_to_r(input$demTb)
    isolate({
    
    index <- which(df_$pick==T) 
    if(length(index)==0) return(df_)
    labs <- iris_$label[index] 
    pages <- "test"
    iter <- length(labs)
    buttn <- 1
    }) # end isolate
    valLabs <- sapply(1:iter, function(i) {
        if(is.null(input[[paste0(pages,"d",labs[i],buttn)]] )) {
          0
        } else {  
          as.numeric(input[[paste0(pages,"d",labs[i],buttn)]])/100  
        }
      })
    
      dft_ <- data.frame(label=labs, multi=valLabs, stringsAsFactors = FALSE)
      dft_ <- merge(iris_,dft_,by="label", all.x=T)
    
      dft_$quantity <- sapply(1:length(dft_$quantity), function(z) {
        if( is.na( dft_$multi[z]) ) { 
        dft_$quantity[z]
      } else { iris_$quantity[z]*(1 + dft_$multi[z]) }
    })
    dft_[with(dft_,order(as.numeric(id))),]
    df_[with(df_,order(as.numeric(id))),]
    
    df_$quantity <- df_$quantity
      return(df_)
      }) 
    
    
    output$demTb  <-  renderRHandsontable({
    
    
    if(is.null(rds() )) return()
    
    df_ <- rds() 
    
    df_ <- df_[with(df_,order(as.numeric(id))),]
    
    rhandsontable(df_, readOnly = FALSE, rowHeaders= NULL, useTypes= TRUE) %>%
      hot_table(highlightCol = TRUE, highlightRow = TRUE) 
    
    
    })
    
    }
    
    
    shinyApp(ui, server)
    

提交回复
热议问题