rshinyshinywidgetspickerinput

using pickerInput in r shiny to apply function


I would like to be able to apply a function to a given set of columns from the RLdata10000 dataset. I have been going through shiny tutorials and am attempting to learn how to use observeEvent and actionButton. However, I would like to be able to pick the columns I use so I came across pickerInput. In short, I would like to be able to pick a set of columns from RLdata10000, and apply the function via actionButton.

My problem is that I get an error: Error: unused argument (RLdata10000). My code is below. I would like to be able to do this with two data files eventually. Any help would be appreciated.

library(shiny)
library(DT)
library(shinyWidgets)
library(plyr)
library(dplyr)
library(RecordLinkage)

data(RLdata10000)

cleanup <- function(x){
  x <- as.character(x) # convert to character
  x <- tolower(x) # make all lowercase
  x <- trimws(x, "both") # trim white space
  return(x)
}

ui <- basicPage(
  h2("Record Linkage Data"),
  actionButton(inputId = "clean", label = "Clean Data")
  pickerInput(width = "75%",
  inputId = "pick_col1",
  label = "Select columns to display",
  choices = colnames(RLdata10000),
  selected = colnames(RLdata10000),
  options = list(
    `actions-box` = T,
    `selected-text-format` = paste("count > ", length(colnames(RLdata10000)) - 1),
  `count-selected-text` = "Alle",
  liveSearch = T,
  liveSearchPlaceholder = T
),

multiple = T)
  DT::dataTableOutput("mytable")
)

server <- function(input, output) {
  observeEvent(input$clean, {
  output$mytable = DT::renderDataTable({
    lapply(input$pick_col1, cleanup)
  })
 }
}
shinyApp(ui, server)

Solution

  • I wasn't actually able to replicate the error you noted, but you had a few issues that were preventing you from getting what (I think) you're after.

    First, you were missing commas in the UI after the actionButton and pickerInput elements.

    Second, you are only giving lapply the names of columns - not the data - when you use input$pick_col1, so your cleanup function has nothing to work on. Using select from dplyr provides a simple way to name the columns and get the data too.

    Last, renderDataTable wants a table format as an input (i.e., either a data frame or a matrix), but lapply produces a list. You need to convert the output of lapply into a workable class.

    From these three changes, updated code would look like this:

    library(shiny)
    library(DT)
    library(shinyWidgets)
    library(plyr)
    library(dplyr)
    library(RecordLinkage)
    
    data(RLdata10000)
    
    cleanup <- function(x){
      x <- as.character(x) # convert to character
      x <- tolower(x) # make all lowercase
      x <- trimws(x, "both") # trim white space
      return(x)
    }
    
    ui <- basicPage(
      h2("Record Linkage Data"),
      actionButton(inputId = "clean", label = "Clean Data"),
      pickerInput(width = "75%",
                  inputId = "pick_col1",
                  label = "Select columns to display",
                  choices = colnames(RLdata10000),
                  selected = colnames(RLdata10000),
                  options = list(
                    `actions-box` = T,
                    `selected-text-format` = paste("count > ", length(colnames(RLdata10000)) - 1),
                    `count-selected-text` = "Alle",
                    liveSearch = T,
                    liveSearchPlaceholder = T
                  ),
    
                  multiple = T),
      DT::dataTableOutput("mytable")
    )
    
    server <- function(input, output) {
      observeEvent(input$clean, {
        output$mytable = DT::renderDataTable({
          data.frame(lapply(select(RLdata10000, input$pick_col1), cleanup))
        })
      })
    }
    
    shinyApp(ui, server)