我有一个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)