Search code examples
rshinyhandsontablerhandsontable

Disable column editing in rhandsontable?


Suppose I have the following shiny app:

library(shiny)
library(rhandsontable)

ui <- shinyUI(fluidPage(
  titlePanel("Handsontable"),
  sidebarLayout(
    sidebarPanel(
      helpText("Handsontable demo output. Column add/delete does work ",
               "for tables with defined column properties, including type."),
      radioButtons("useType", "Use Data Types", c("TRUE", "FALSE"))
    ),
    mainPanel(
      rHandsontableOutput("hot", width = 350)
    )
  )
))

server <- shinyServer(function(input, output, session) {
  values = reactiveValues()

  data = reactive({
    if (!is.null(input$hot)) {
      DF = hot_to_r(input$hot)
    } else {
      if (is.null(values[["DF"]]))
        DF = data.frame(val = 1:10, bool = TRUE, nm = LETTERS[1:10],
                        dt = seq(from = Sys.Date(), by = "days", length.out = 10),
                        stringsAsFactors = F)
      else
        DF = values[["DF"]]
    }


    values[["DF"]] = DF
    DF
  })

  output$hot <- renderRHandsontable({
    DF = data()
    if (!is.null(DF))
      rhandsontable(DF, useTypes = as.logical(input$useType), stretchH = "all")
  })
})

# Run the application 
shinyApp(ui = ui, server = server)

How can I disable editing for the first two columns?


Solution

  • The whole table and individual columns can to set to readOnly to prevent the user from making changes.(http://jrowen.github.io/rhandsontable/#read-only)

    library(shiny)
    library(rhandsontable)
    
    ui <- shinyUI(fluidPage(
      titlePanel("Handsontable"),
      sidebarLayout(
        sidebarPanel(
          helpText("Handsontable demo output. Column add/delete does work ",
                   "for tables with defined column properties, including type."),
          radioButtons("useType", "Use Data Types", c("TRUE", "FALSE"))
        ),
        mainPanel(
          rHandsontableOutput("hot", width = 350)
        )
      )
    ))
    
    server <- shinyServer(function(input, output, session) {
      values = reactiveValues()
    
      data = reactive({
        if (!is.null(input$hot)) {
          DF = hot_to_r(input$hot)
        } else {
          if (is.null(values[["DF"]]))
            DF = data.frame(val = 1:10, bool = TRUE, nm = LETTERS[1:10],
                            dt = seq(from = Sys.Date(), by = "days", length.out = 10),
                            stringsAsFactors = F)
          else
            DF = values[["DF"]]
        }
    
    
        values[["DF"]] = DF
        DF
      })
    
      output$hot <- renderRHandsontable({
        DF = data()
        if (!is.null(DF))
          rhandsontable(DF, useTypes = as.logical(input$useType), stretchH = "all") %>%
          hot_col("val", readOnly = TRUE) %>%
          hot_col("bool",readOnly = TRUE )
      })
    })
    
    # Run the application 
    shinyApp(ui = ui, server = server)