Визуализация Dynami c вкладок с Dynami c графиков от l oop в Shiny - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь заполнить динамически сгенерированные вкладки графиками, сделанными из al oop, но не могу заставить вкладки заполнить все графики, созданные в l oop.

shinyUI(pageWithSidebar(

  headerPanel("Dynamic number of plots"),

sidebarPanel(
),

mainPanel(
# This is the dynamic UI for the plots
uiOutput("IndividualPlots")
 )
))

server <- function(input, output) {

output$IndividualPlots <- renderUI({
  if (is.null(input$data_cqt0)) {
    return()
  }
  plot_content()
  shiny:::buildTabset(
    id = "t",
    lapply(1:PageNumber(), function(i){
      plotname <- paste("plot", i, sep="")
      tabPanel(title = sprintf("Page_%s",i),
               #browser(),
               plotOutput(plotname,width = "800px", height = "600px") 
      )
    }), 
    paste0("nav nav-","tabs")) %>% (function(x){
      tags$div(class = "tabbable", x[[1]], x[[2]])
    })
})


plot_content<- reactive({
  for (i in 1:PageNumber()) {
    local({
      my_i <- i
      plotname <- paste("plot", my_i, sep="")   
      output[[plotname]] <- renderPlot({
          print(Plots()[[i]])
      })
    })
  }
})

PageNumber <- reactive({
  data <- data()
  return(PlotPageNumber(data, input$Class)) ## Returns number of plots
})



Plots <- reactive({
    data <- data()
     return(PlotFunction(data, input$Class)) ## Returns plots in list
    })
   }

Этот код почти работает, но он заполняет обе вкладки последним графиком в индексе plot_content(). Я застрял в том, как получить все графики из plot_content(), чтобы динамически заполнить соответствующее количество созданных вкладок.

1 Ответ

1 голос
/ 19 июня 2020

Ваша проблема в том, что Shiny reactive s лениво оценивают. В результате при рендеринге графиков значение индекса i равно PageNumber() для всех из них. Я предпочитаю решение этой проблемы - создать модуль для управления отображением графиков. (Модуль также может обрабатывать любые другие действия, связанные с сюжетом.) Отдельный экземпляр модуля управляет каждым отдельным сюжетом. В результате получается код, который обычно короче, надежнее и проще для понимания и обслуживания, чем другие решения.

Хотя главный вопрос OP отличается от вашего, мой ответ (в частности, вторая версия) на этот пост является демонстрацией этой техники.

...