rif-statementshinyshiny-reactivityvtree

How to control an argument of a function depending on a radiobutton choice in R shiny


This is a follow-up to this Dynamic change in vtree within shiny: How to deselect

With this code below, I try to switch the arguments prunesmaller and prunebigger of the vtree package. I am quite sure to do this with an if else but I am not able to fix it:

In general I want to know how to tweak any argument of any function depending on a radiobutton in r shiny:

Here is my code so far:

library(shiny)
library(vtree)


# Define UI ----
ui <- pageWithSidebar(
  
  # App title ----
  headerPanel("Cyl vtree"),
  
  # Sidebar panel for inputs ----
  sidebarPanel(
    radioButtons("smaller_bigger", h3("Prune smaller or bigger?"), choices = c("smaller", "bigger"), inline = TRUE),
    
    sliderInput(inputId = "prune", label = "Number to prune?", step = 10, min = 0, max = 100, value = 0),
    
    selectizeInput("level", label = "Level", choices = NULL, multiple=TRUE),
    # This line is the only change from the original code
    selectizeInput("values", label= "Values", choices = NULL, multiple=TRUE),
  ),
  
  # Main panel for displaying outputs ----
  mainPanel(
    vtreeOutput("VTREE")
    
  )
)

# Define server logic to plot ----
server <- function(input, output,session) {
  df <- reactiveVal(mtcars)
  vector <- c("cyl","vs", "am","gear")
  
  observe({
    updateSelectizeInput(session, "level", choices = colnames(df()[vector]), selected = NULL) 
    updateSelectizeInput(session, "values", choices = unique(df()$cyl))
  })
  
  output[["VTREE"]] <- renderVtree({
    vtree(df(), c(input$level),
          sameline = TRUE,
          follow=list(cyl=input$values),
          
          if(input$smaller_bigger=="smaller"){
            prunesmaller = input$prune
          } else
            (input$smaller_bigger == "bigger"){
              prunebigger = input$prune
            }
          )
  })
  
}

shinyApp(ui, server)

In essence I try to handle this part of the code:

  if(input$smaller_bigger=="smaller"){
            prunesmaller = input$prune
          } else
            (input$smaller_bigger == "bigger"){
              prunebigger = input$prune
            }
          )

It should do: If radiobutton smaller is choosen then the argument should be prunesmaller == input$prune (where input$prune comes from the sliderinput)

If I replace the if else part by prunesmaller = input$prune the code works but only with prunesmaller: enter image description here


Solution

  • The way you use the if will not work to set the functions argument. Instead use a single if for each argument, e.g. prunesmaller = if (input$smaller_bigger == "smaller") input$prune.

    Note: Maybe I missed something, but I got an error when trying to set prunebigger and according to the docs there is no prunebigger argument.

    library(shiny)
    library(vtree)
    
    
    # Define UI ----
    ui <- pageWithSidebar(
    
      # App title ----
      headerPanel("Cyl vtree"),
    
      # Sidebar panel for inputs ----
      sidebarPanel(
        radioButtons("smaller_bigger", h3("Prune smaller or bigger?"), choices = c("smaller", "bigger"), inline = TRUE),
        sliderInput(inputId = "prune", label = "Number to prune?", step = 10, min = 0, max = 100, value = 0),
        selectizeInput("level", label = "Level", choices = NULL, multiple = TRUE),
        # This line is the only change from the original code
        selectizeInput("values", label = "Values", choices = NULL, multiple = TRUE),
      ),
    
      # Main panel for displaying outputs ----
      mainPanel(
        vtreeOutput("VTREE")
      )
    )
    
    # Define server logic to plot ----
    server <- function(input, output, session) {
      df <- reactiveVal(mtcars)
      vector <- c("cyl", "vs", "am", "gear")
    
      observe({
        updateSelectizeInput(session, "level", choices = colnames(df()[vector]), selected = NULL)
        updateSelectizeInput(session, "values", choices = unique(df()$cyl))
      })
    
      output[["VTREE"]] <- renderVtree({
        vtree(df(), c(input$level),
          sameline = TRUE,
          follow = list(cyl = input$values),
          prunesmaller = if (input$smaller_bigger == "smaller") input$prune
          #prunebigger = if (input$smaller_bigger == "bigger") input$prune
        )
      })
    }
    
    shinyApp(ui, server)
    

    enter image description here

    enter image description here