динамически настраивать коробку Shinydashboard и сюжетный график с количеством графиков - PullRequest
0 голосов
/ 18 января 2019

У меня есть приложение shinydashboard , и я хочу вывести объект plot_ly() в shinydashboard::box() разное время, в зависимости от входного значения пользователя. Однако поле не становится больше, но размер графиков уменьшается только для того, чтобы уместиться в поле.

Вопрос: Как увеличить размер ящика в зависимости от количества участков?

Цель: Я хочу, чтобы поле Plot1 выглядело как поле Plot2 , когда для поля , введенного в число , установлено значение 3.

Идея: Мой план состоял в том, чтобы умножить размер по умолчанию (400 пикселей) для прямоугольника на количество графиков для построения. То есть поместите переменную в height = sprintf('%spx', 1 * 400) вместо 1. Однако из пользовательского интерфейса я не могу получить доступ к выводу реактивной функции plot_fun(), где хранится эта информация.

require(shiny)
require(shinydashboard)
require(plotly)

# setup -------------------------------------------------------------------
plot_fun = function(data, n) {
  p1 = plot_ly(data) %>% 
    add_trace(x = ~Sepal.Length, y = ~Sepal.Width,
              type = 'scatter', mode = 'markers')

  p_l = rep(list(p1), n)
  p_fin = subplot(p_l,
                  nrows = length(p_l)#,
                  # heights = 1/n # heights of subplots
                  )

  return(p_fin)
}

# ui ----------------------------------------------------------------------
header = dashboardHeader()

sidebar = dashboardSidebar(
  numericInput('num_in', 'put in a number', value = 1)
)

body = dashboardBody(
  fluidRow(
    box('Plot1',
        width = 6,
        # height = '500px', # box height - scales automatically
        plotlyOutput(outputId = 'plot1',
                     height = sprintf('%spx', 1 * 400))), # 400px is the default
    box('Plot2',
        width = 6,
        plotlyOutput(outputId = 'plot2',
                     height = sprintf('%spx', 3 * 400)))
  )
)


ui = dashboardPage(header, sidebar, body)

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

  output$plot1 = renderPlotly({ plot_fun(iris, input$num_in) })
  output$plot2 = renderPlotly({ plot_fun(iris, 3) })

}

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