Задача : используя R
и shinydashboard
, внедрить пользовательский график, созданный Javascript, в тело панели управления. Укажите ширину графика в процентах , чтобы график занимал свой столбец (или поле) независимо от настроек экрана зрителя.
Настройка : R
(3.5.2), shiny
(1.2.0) и shinydashboard
(0.7.1). Код панели инструментов (упрощенный воспроизводимый пример) выглядит следующим образом:
library(shiny)
library(shinydashboard)
ui <- fluidPage(
dashboardPage(
dashboardHeader(),
dashboardSidebar(
sidebarMenu(
menuItem("Main", tabName = "tab1", icon = icon("dashboard")
)
)
),
dashboardBody(
tabItems(
tabItem("tab1",
column(width = 12,
tags$div(id = "main", style = "width: 100%; height: 400px"),
tags$script(src = "http://cdnjs.cloudflare.com/ajax/libs/echarts/4.1.0/echarts.min.js"),
tags$script(src = "myscript.js")
)
)
)
)
)
)
server <- function(input, output) {
}
# Run the application
shinyApp(ui = ui, server = server)
Соответствующий файл Javascript myscript.js
, который должен быть помещен в подпапку www
относительно самого файла приложения, выглядит следующим образом:
// JS Plot with Echarts 4
option = {
xAxis: {
type: 'category',
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
},
yAxis: {
type: 'value'
},
series: [{
data: [820, 932, 901, 934, 1290, 1330, 1320],
type: 'line'
}]
};
var myChart = echarts.init(document.getElementById('main'));
myChart.setOption(option);
Проблема : по какой-то причине спецификация 100%
преобразуется в 100px
в конечном результате, что приводит к следующему выводу:
Осматривая график, я вижу, что div#main
действительно имеет ширину 100%, но затем он содержит другой, меньший div
, который уже 100px
широкий:
Мне может показаться, что виноваты либо tabItem
, либо tabItems
, потому что без их использования результат верен, и меньший посредник div
правильно получает ширину от своего родителя:
Для полноты код рабочей версии (без tabItem(s)
) такой:
library(shiny)
library(shinydashboard)
ui <- fluidPage(
dashboardPage(
dashboardHeader(),
dashboardSidebar(),
dashboardBody(
column(width = 12,
tags$div(id = "main", style = "width: 100%; height: 400px"),
tags$script(src = "http://cdnjs.cloudflare.com/ajax/libs/echarts/4.1.0/echarts.min.js"),
tags$script(src = "myscript.js")
)
)
)
)
server <- function(input, output) {
}
# Run the application
shinyApp(ui = ui, server = server)
Как видите, код практически идентичен, за исключением функций-нарушителей. Однако я не понимаю, как Shinydashboard может работать без этих функций, поскольку они структурируют все приложение. Есть ли какой-нибудь способ обойти это? Благодарю.