R Shiny: несколько динамически создаваемых графиков - позиционирование не работает - PullRequest
0 голосов
/ 08 марта 2019

Уважаемые программисты 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({}) не похожа для двух графиков - динамические графики отличаются.

...