Уважаемые программисты R Shiny,
Я хочу включить два динамически создаваемых графика в мою панель инструментов, каждый из которых находится на отдельном menuItem
. Я использую uiOutput("plot_1")
для определения первого графика на одном menuItem
, а затем я определяю другой с помощью uiOutput("plot_2")
для РАЗНОГО menuItem
. Затем на сервере я использую output$plot_1 <- renderUI({ some code })
для рендеринга первого динамического графика и output$plot_2 <- renderUI({ some code })
для рендеринга второго динамического графика. Тем не менее, появляется только первый из графиков (plot_1) с заголовком второго графика !! Второй график (plot_2), который должен был отображаться на menuItem
, который я определил в ui
, вообще не отображается.
Не могли бы вы помочь мне, пожалуйста?
Ниже я создал пример кода, который может легко воспроизвести мою проблему:
max_plots <- 5
ui <- dashboardPage(
dashboardHeader(title = "Show dynamic plots"),
dashboardSidebar(
sidebarMenu(
menuItem("Slider 1", tabName = "tab_1", icon = icon("th")),
menuItem("Slider 2", tabName = "tab_2", icon = icon("th")),
menuItem("First Plot", tabName = "tab_3", icon = icon("line-chart")),
menuItem("Second Plot", tabName = "tab_4", icon = icon("line-chart"))
)
),
dashboardBody(
tabItems(
tabItem(tabName = "tab_1",
fluidRow(
box(title = "", status = "primary", width = 12,
sliderInput("n_1", "Number of plots 1", value=1, min=1, max=5)
)
)
),
tabItem(tabName = "tab_2",
fluidRow(
box(title = "", status = "primary", width = 12,
sliderInput("n_2", "Number of plots 2", value=1, min=1, max=5)
)
)
),
tabItem(tabName = "tab_3",
fluidRow(
box(title = "", status = "primary", width = 12,
uiOutput("plot_1")
)
)
),
tabItem(tabName = "tab_4",
fluidRow(
box(title = "", status = "primary", width = 12,
uiOutput("plot_2")
)
)
)
)
)
)
server <- function(input, output, session) {
## For dynamic plot 1
output$plot_1 <- renderUI({
plot_output_list_1 <- lapply(1:input$n_1, function(i) {
plotname_1 <- paste("plot", i, sep="")
plotOutput(plotname_1, height = 280, width = 250)
})
do.call(tagList, plot_output_list_1)
})
for (i in 1:max_plots) {
local({
my_i <- i
plotname_1 <- paste("plot", my_i, sep="")
output[[plotname_1]] <- renderPlot({
plot(1:my_i, 1:my_i,
xlim = c(1, max_plots),
ylim = c(1, max_plots),
main = paste("1:", my_i, ". n_1 is ", input$n_1, sep = "")
)
})
})
}
## For dynamic plot 2
output$plot_2 <- renderUI({
plot_output_list_2 <- lapply(1:input$n_2, function(i) {
plotname_2 <- paste("plot", i, sep="")
plotOutput(plotname_2, height = 280, width = 250)
})
do.call(tagList, plot_output_list_2)
})
for (i in 1:max_plots) {
local({
my_i <- i
plotname_2 <- paste("plot", my_i, sep="")
output[[plotname_2]] <- renderPlot({
plot(1:my_i, 1:my_i,
xlim = c(1, max_plots),
ylim = c(1, max_plots),
main = paste("1:", my_i, ". n_2 is ", input$n_2, sep = "")
)
})
})
}
}
shinyApp(ui, server)
Не могли бы вы мне помочь, чтобы первый график был создан на одном menuItem
, а второй - на другом menuItem
? Также обратите внимание, что в моем исходном коде функция renderPlot({})
не похожа для двух графиков - динамические графики отличаются.