Блестящий: динамическое количество таблиц данных - PullRequest
0 голосов
/ 07 июня 2018

Я использую прикрепленный код для генерации вложенных таблиц на основе групп.По какой-то причине для каждой таблицы отображается только последняя часть данных.Было бы замечательно, если бы кто-то мог сказать мне, что происходит неправильно.

BR

enter image description here

library(shiny)
library(shinydashboard)
library(DT)
library(data.table)

tabnames <- LETTERS[1:6]

DT <- data.table(mtcars[1:30,], keep.rownames=TRUE)
DT[, grp:=rep(tabnames, each=trunc(nrow(mtcars)/length(tabnames)))]


ui = dashboardPage(
  dashboardHeader(title = "Dynamic DTs"),
  dashboardSidebar(),
  dashboardBody(
    uiOutput("tables"),
    p(),
    verbatimTextOutput("selectedCells")
  )
  )


server <- function(input, output, session) {
  output$tables <- renderUI({
    output_list <- list()
    for(i in seq(tabnames)){
      output_list[[i]] <- column(4, DT::dataTableOutput(outputId=tabnames[i]))
    }
    print(fluidRow(output_list))
    return(fluidRow(output_list))
  })


  for(i in seq(tabnames)){
    tabname <- tabnames[i]
    local({
      print(DT[grp %in% tabname, 1:3])
      output[[tabname]] <- DT::renderDataTable({
        DT[grp %in% tabname, 1:3]
      }, selection=list(mode="multiple", target="cell"))
    })
  }
  output$selectedCells <- renderPrint(input$A_cells_selected)
}

shinyApp(ui = ui, server = server)

1 Ответ

0 голосов
/ 07 июня 2018

Хорошо, найдено решение: нужно передать его в отдельной переменной:

library(shiny)
library(shinydashboard)
library(DT)
library(data.table)

tabnames <- LETTERS[1:6]

DT <- data.table(mtcars[1:30,], keep.rownames=TRUE)
DT[, grp:=rep(tabnames, each=trunc(nrow(mtcars)/length(tabnames)))]


ui = dashboardPage(
  dashboardHeader(title = "Dynamic DTs"),
  dashboardSidebar(),
  dashboardBody(
    uiOutput("tables"),
    p(),
    verbatimTextOutput("selectedCells")
  )
  )


server <- function(input, output, session) {
  output$tables <- renderUI({
    output_list <- list()
    for(i in seq(tabnames)){
      output_list[[i]] <- column(4, DT::dataTableOutput(outputId=tabnames[i]))
    }
    print(fluidRow(output_list))
    return(fluidRow(output_list))
  })


  for(i in seq(tabnames)){
    tabname <- tabnames[i]
    local({
      subDT <- DT[grp %in% tabname, 1:3]
      output[[tabname]] <- DT::renderDataTable({
        subDT
      }, selection=list(mode="multiple", target="cell"))
    })
  }
  output$selectedCells <- renderPrint(input$A_cells_selected)
}

shinyApp(ui = ui, server = server)
...