Как я могу устранить пустое место заполнителя из блестящих приложений? - PullRequest
1 голос
/ 01 июля 2019

При создании блестящих приложений я часто сталкиваюсь с тем, как расположить графики и текстовые выводы на странице для пользователя.Поэтому я хотел бы попытаться сделать так, чтобы пользователь мог выбрать, какой вывод отображать.Например, пользователь может отображать 3 графика и 2 фрагмента текста, но может захотеть отобразить только первый график и один фрагмент текста.Обычно я могу сделать это с помощью операторов if внутри функций рендеринга.Но я обнаружил, что блеск будет добавлять пустое пространство, даже если ... пользователь не указывает, что график должен отображаться.Похоже, это какое-то пространство-заполнитель, которое в итоге оставляет большие дыры в приложении.В моем примере приложение отображает 2-й график, но есть большой кусок белого пространства, который делает страницу уродливой.

Я нашел это: Блестящий: нежелательное пространство, добавленное plotOutput () и / или renderPlot () , которое не совсем применимо.Кажется, что нет поста, посвященного этой конкретной проблеме.

library(shiny)

ui <- fluidPage(

   titlePanel("Old Faithful Geyser Data"),

   sidebarLayout(
      sidebarPanel(
         sliderInput("bins",
                     "Number of bins:",
                     min = 1,
                     max = 50,
                     value = 30)),
      mainPanel(
         plotOutput("distPlot"),
         plotOutput("distPlot2"))))


server <- function(input, output) {

   output$distPlot <- renderPlot({
      if(input$bins == 4){
      x    <- faithful[, 2] 
      bins <- seq(min(x), max(x), length.out = input$bins + 1)
      hist(x, breaks = bins, col = 'darkgray', border = 'white')
   }})

   output$distPlot2 <- renderPlot({
      x    <- faithful[, 2] 
      bins <- seq(min(x), max(x), length.out = input$bins + 1)
      hist(x, breaks = bins, col = 'darkgray', border = 'white')})
   }

shinyApp(ui = ui, server = server)

1 Ответ

1 голос
/ 01 июля 2019

В данном конкретном случае возможны два варианта: обернуть первый график в shiny::conditionalPanel() или использовать shiny::renderUI().

shiny::conditionalPanel() Пример

library(shiny)

ui <- fluidPage(

  titlePanel("Old Faithful Geyser Data"),

  sidebarLayout(
    sidebarPanel(
      sliderInput("bins",
                  "Number of bins:",
                  min = 1,
                  max = 50,
                  value = 30)),
    mainPanel(
      conditionalPanel("input.bins == 4", plotOutput("distPlot")),
      plotOutput("distPlot2"))))

server <- function(input, output) {

  output$distPlot <- renderPlot({
      x    <- faithful[, 2] 
      bins <- seq(min(x), max(x), length.out = input$bins + 1)
      hist(x, breaks = bins, col = 'darkgray', border = 'white')
    })

  output$distPlot2 <- renderPlot({
    x    <- faithful[, 2] 
    bins <- seq(min(x), max(x), length.out = input$bins + 1)
    hist(x, breaks = bins, col = 'darkgray', border = 'white')})
}

shinyApp(ui = ui, server = server)

shiny::renderUI() Пример

library(shiny)

ui <- fluidPage(

  titlePanel("Old Faithful Geyser Data"),

  sidebarLayout(
    sidebarPanel(
      sliderInput("bins",
                  "Number of bins:",
                  min = 1,
                  max = 50,
                  value = 30)),
    mainPanel(
      uiOutput("distPlots"))))


server <- function(input, output) {
  output$distPlot <- renderPlot({
      x    <- faithful[, 2] 
      bins <- seq(min(x), max(x), length.out = input$bins + 1)
      hist(x, breaks = bins, col = 'darkgray', border = 'white')
    })

  output$distPlot2 <- renderPlot({
    x    <- faithful[, 2] 
    bins <- seq(min(x), max(x), length.out = input$bins + 1)
    hist(x, breaks = bins, col = 'darkgray', border = 'white')})

  output$distPlots <- renderUI({
    if(input$bins == 4)
      fluidPage(plotOutput("distPlot"), plotOutput("distPlot2"))
    else
      plotOutput("distPlot2")
  })
}

shinyApp(ui = ui, server = server)

Оба подхода дают следующее:

output of either approach

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...