动态调整Shinydashboard框并根据地块数量绘制地块

时间:2019-01-18 16:38:09

标签: r shiny plotly shinydashboard r-plotly

我有一个shinydashboard应用,并且想根据用户的输入值在plot_ly()的不同时间输出shinydashboard::box()对象。但是,盒子并没有变大,但是地块的大小只是减小了以适合盒子。

问题:如何根据地块数量增加盒子大小?

目标:当字段输入数字为时,我希望框 Plot1 看起来像框 Plot2 设置为3。

想法:我的计划是将框的默认像素大小(400px)乘以要绘制的图的数量。即将变量放入height = sprintf('%spx', 1 * 400)而不是1中。但是,从ui中,我无法访问存储此信息的反应性函数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)

0 个答案:

没有答案