Блестящий держит пустой блан c пространство, когда графики не отображаются - PullRequest
2 голосов
/ 06 апреля 2020

Контекст: блестящее приложение позволяет пользователю выбирать, отображать или нет таблицы и графики.

Проблема: Интерфейс пользователя сохраняет большой белый "заполнитель" пространства для графики, если они не отображаются (это поведение не требуется). Но когда дело доходит до таблиц, пользовательский интерфейс не отображает этот пустой пробел (ожидаемое поведение).

Вопрос: Как запретить Shiny хранить пустой заполнитель для графиков?

Предыдущие исследования: Этот вопрос уже задавался здесь , но ответ @ the-mad-statter не соответствует моим потребностям. Я хотел бы понять, почему Shiny имеет такое поведение и, если возможно, исправить его, не меняя пользовательский интерфейс.

Большое спасибо за вашу помощь! Ниже приведен воспроизводимый пример и несколько снимков экрана.

Воспроизводимый пример

library(shiny)
library(tidyverse)

# basic user interface
ui <- fluidPage(
    checkboxGroupInput(inputId = "checkboxes", label = NULL ,choices = list("Plot"="plot", "Table"="table")),
    plotOutput(outputId = "plotdf1"),
    tableOutput(outputId = "tabledf"),
    plotOutput(outputId = "plotdf2")
)

# server side calculations
server <- function(input, output, session) {
    df = mtcars
    output$plotdf1 = renderPlot({
      if("plot"%in%input$checkboxes){
      ggplot(data = df, aes(x = disp, y = qsec)) +
        geom_line()
      }
    })

    output$tabledf = renderTable({
      if("table"%in%input$checkboxes){
      df[1:5,]
      }
    })
    output$plotdf2 = renderPlot({
      if("plot"%in%input$checkboxes){
        ggplot(data = df, aes(x = gear)) +
          geom_bar()
      }
    })

}
shinyApp(ui,server)

Снимки экрана: Все объекты отображаются:

all objects

Когда таблица удаляется, пользовательский интерфейс «заполняет» / удаляет пустое пространство

table ok

Но при удалении графиков остается пустой заполнитель

plot not ok

1 Ответ

2 голосов
/ 06 апреля 2020

1. Использование conditionalPanel

Вы можете использовать conditionalPanel, чтобы скрыть область графика, когда Plot не выбран:

ui <- fluidPage(
  checkboxGroupInput(inputId = "checkboxes", label = NULL, 
                     choices = list("Plot"="plot", "Table"="table")),
  conditionalPanel(
    "input.checkboxes.indexOf('plot') > -1",
    plotOutput(outputId = "plotdf1")
  ),
  tableOutput(outputId = "tabledf"),
  conditionalPanel(
    "input.checkboxes.indexOf('plot') > -1",
    plotOutput(outputId = "plotdf2")
  )
)

2. Использование renderUI()

Как предлагается в разделе комментариев, другой подход с renderUI():

Модификации гораздо важнее, чем в 1-й идее, но в случае неудачи это может быть хорошая альтернатива.

library(shiny)
library(tidyverse)

# basic user interface
ui <- fluidPage(
  checkboxGroupInput(
    inputId = "checkboxes",
    label = NULL ,
    choices = list("Plot" = "plot", "Table" = "table")
  ),
  uiOutput(outputId = "uiplotdf1"),
  uiOutput(outputId = "uitabledf"),
  uiOutput(outputId = "uiplotdf2")
)

# server side calculations
server <- function(input, output, session) {
  df = mtcars
  # create the object to render and the conditional UI display anlong with it
  # 1st plot------------------
  # object
  output$plotdf1 = renderPlot({
    ggplot(data = df, aes(x = disp, y = qsec)) +
      geom_line()
  })
  # conditional UI
  output$uiplotdf1 = renderUI({
    if ("plot" %in% input$checkboxes) {
      plotOutput(outputId = "plotdf1")
    }
  })
  # table----------------------
  output$tabledf = renderTable({
    df[1:5, ]
  })
  output$uitabledf = renderUI({
    if ("table" %in% input$checkboxes) {
      tableOutput(outputId = "tabledf")
    }
  })
  #2nd plot---------------------
  output$plotdf2 = renderPlot({
    ggplot(data = df, aes(x = gear)) +
      geom_bar()
  })
  output$uiplotdf2 = renderUI({
    # this render is not pulled with the 1st one bcse otherwise we have to put plots in a "bigger" element (such as fluidrow)
    if ("plot" %in% input$checkboxes) {
      plotOutput(outputId = "plotdf2")
    }
  })

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