pat2402
pat2402

Reputation: 79

Passing a reactive value to a plotting function as argument

I am trying to pass a reactive value derived from the selectizeInput select1 to a plotting function. The reactive value itself is dependent on input from awesomeRadio radio1.

Unfortunately, passing this value to the plot function does not work, although it's accessible by renderText(). Here is an example:

library(shiny)
library(shinydashboard)
##### plot function ------------------------ 
plot_function <- function(highlight){
  plot(1:9)
  points(x=c(1:9)[highlight],
         y=c(1:9)[highlight],
         col="red")
}

##### ui ------------------------ 
header <- dashboardHeader(
  title = "Title",
  titleWidth = 500
)
body <- dashboardBody(
  fluidRow(
    column(width = 4,
           box(title = "Plot 1",
               plotOutput("plot1", height = 300)
               ),
           box(width = NULL, status = "warning",
               awesomeRadio(inputId = "radio1",
                            label = "Radio1",
                            choices = c("Option1","Option2"),
                            inline = TRUE,
                            status="primary"
               ),br(),
               uiOutput("select1"))
    ),
    column(width = 3,
           box(width = NULL, status = "warning",
               textOutput(outputId = "option1")),
           box(width = NULL, status = "warning",
               textOutput(outputId = "option2")))
  )
)
ui = dashboardPage(
  header,
  dashboardSidebar(disable = TRUE),
  body
)

##### server ------------------------ 
server =   function(input, output) { 
  onSessionEnded(stopApp)

  choices = reactive({
    if (input$radio1=="Option1") {
      1:4
    } else if (input$radio1=="Option2") {
      5:8
    }
  })
  output$select1 <- renderUI({
    selectizeInput("select1", label="Select1",
                   choices=choices())
                   })

  tmp = reactive({input$radio1})
  tmp2 = reactive({input$select1})
  output$plot1 <- renderPlot(plot_function(highlight = tmp2()))
  output$option1 = renderText(paste(tmp()))
  output$option2 = renderText(paste(tmp2()))
}
##### ui ------------------------ 
shinyApp(ui,server)

Also, I don't quite understand the different behavior of tmp and tmp2, since passing tmp to the plot function would work. Thank you for any help!

Upvotes: 0

Views: 285

Answers (1)

msr_003
msr_003

Reputation: 1233

After few changes in your code

library(shiny)
library(shinyWidgets)

ui <- fluidPage(
    fluidRow(
      column(width = 4,
             box(title = "Plot 1",
                 plotOutput("plot1", height = 300)
             ),
             box(width = NULL, status = "warning",
                 awesomeRadio(inputId = "radio1",
                              label = "Radio1",
                              choices = c("Option1","Option2"),
                              inline = TRUE,
                              status = "primary"
                 ),br(),
                 uiOutput("select1"))
      ),
      column(width = 3,
             box(width = NULL, status = "warning",
                 textOutput(outputId = "option1")),
             box(width = NULL, status = "warning",
                 textOutput(outputId = "option2")))
)
)

##### server ------------------------
server <- function(input, output) {
  onSessionEnded(stopApp)

  choices <- reactive({
    if (input$radio1 == "Option1") {
      1:4
    } else if (input$radio1 == "Option2") {
      5:8
    }
  })
  output$select1 <- renderUI({
    selectizeInput("sel", label = "Select1",
                   choices = choices())
  })

  output$plot1 <- renderPlot({
    plot(1:9)
    points(x = c(1:9)[as.numeric(input$sel)],
           y = c(1:9)[as.numeric(input$sel)],
           col = "red")
  })
  output$option1 <- renderText(input$radio1)
  output$option2 <- renderText(input$sel)
}

shinyApp(ui,server)

Upvotes: 2

Related Questions