Показывать ползунки на основе переключателей в Shiny R - PullRequest
2 голосов
/ 27 марта 2020

Как заставить Ползунок (назовите его, например, «Divide mtcars wt») всплывающим для радиокнопки «option b», и разделите x на aes (то есть wt из наборов данных mtcars) «option b» с этим значением ползунка в воспроизводимом примере ниже? И затем, если выбран переключатель «option a», снова скройте этот Slider. Я посмотрел несколько постов переполнения стека, но они не помогли. Я продолжал получать NULL ошибка вывода графика для «варианта b», когда я его реализовал, поэтому я его убрал.

library(shiny)
library(ggplot2)
options(warn=-1)

#ui.r
ui <- pageWithSidebar(
  headerPanel("many plots app"),

  sidebarPanel(
    sliderInput("width", "Plot Width (%)", min = 0, max = 100, value = 100), 
    sliderInput("height", "Plot Height (px)", min = 0, max = 800, value = 800),
    uiOutput("filter_plot")

  ),

  mainPanel(
    uiOutput("plot")
  )
)
#server.r
server <- function(input, output, session) {

  options(warn = -1) #This doesn't stop console warning

  output$filter_plot<-renderUI({
    radioButtons("rd","Select Option",choices = c("a",
                                                  "b",
                 selected = "a"))
  })

output$plot <- renderUI({
    if(input$rd=="a"){
      output$plot1<- renderPlot({
        ggplot2::ggplot(mtcars, aes(mpg, cyl))+ geom_point()
      })
      plotOutput("plot1", width = paste0(input$width, "%"), height = input$height)
    }
    else if(input$rd=="b"){
      output$plot2<- renderPlot({
        ggplot2::ggplot(mtcars, aes(wt, qsec))+ geom_line()

      })
      plotOutput("plot2", width = paste0(input$width, "%"), height = input$height)
    }
  })
}
shinyApp(ui = ui, server = server)

Заранее спасибо!

Еще одна услуга, если вы Может, почему в консоли есть предупреждение, хотя я их спрятал? Мое приложение работает, но предупреждения есть:

#Warning: Error in if: argument is of length zero
#  96: renderUI [C:/Users/YOU/Documents/DIRECTORY/xyz.R#443]
#  95: func
#  82: origRenderFunc
#  81: output$plot
#  1: runApp

1 Ответ

2 голосов
/ 27 марта 2020

Вы можете использовать conditionalPanel, чтобы показать / скрыть a sliderInput, когда на вашем радиокнопке выбрано 'b'.

Чтобы предотвратить предупреждение, вы можете потребовать req(input$rd) перед его использованием в вашем if утверждение.

Дайте мне знать, если вы имели в виду такое поведение.

library(shiny)
library(ggplot2)
options(warn=-1)

#ui.r
ui <- pageWithSidebar(
  headerPanel("many plots app"),

  sidebarPanel(
    sliderInput("width", "Plot Width (%)", min = 0, max = 100, value = 100), 
    sliderInput("height", "Plot Height (px)", min = 0, max = 800, value = 800),
    uiOutput("filter_plot"),
    conditionalPanel(
      "input.rd == 'b'",
      sliderInput("sl_wt", "Divide Weight", min = 1, max = 10, value = 5)
    )
  ),

  mainPanel(
    uiOutput("plot")
  )
)
#server.r
server <- function(input, output, session) {

  options(warn = -1) #This doesn't stop console warning to stop

  output$filter_plot<-renderUI({
    radioButtons("rd","Select Option",choices = c("a",
                                                  "b",
                                                  selected = "a"))
  })

  output$plot1<- renderPlot({
    ggplot2::ggplot(mtcars, aes(mpg, cyl))+ geom_point()
  })

  output$plot2<- renderPlot({
    ggplot2::ggplot(mtcars, aes(wt/input$sl_wt, qsec))+ geom_line()
  })

  output$plot <- renderUI({
    req(input$rd)
    if(input$rd=="a"){
      plotOutput("plot1", width = paste0(input$width, "%"), height = input$height)
    }
    else if(input$rd=="b"){
      plotOutput("plot2", width = paste0(input$width, "%"), height = input$height)
    }
  })
}
shinyApp(ui = ui, server = server)
...