2016-09-01 2 views
4

현재 각 탭마다 고유하게 동적으로 생성 된 데이터 테이블을 만들려고합니다. 탭 수는 사용자가 결정합니다. 프레임 워크로 this post 코드를 사용했습니다.R Shiny : 동적으로 생성 된 탭에 데이터 테이블을 추가하는 방법

탭을 동적으로 만들 수 있지만 데이터 테이블을 탭에 추가하는 방법을 알 수 없습니다. 데이터 테이블은 사용자 입력에 의해서도 결정됩니다.

library(shiny) 
shinyUI(fluidPage(
     titlePanel("Example"), 
     sidebarLayout(
      sidebarPanel(
       selectInput("decision", label = "Choose Dataset", 
          choices = list("mtcars" = "mtcars", 
              "iris" = "iris", 
              "precip" = "precip", 
              "quakes" = "quakes"), 
          selected = NULL, multiple = TRUE) 
      ), 
      mainPanel(
       uiOutput('mytabs') 
      ) 
    ) 
)) 

server.R

library(shiny) 
library(ggplot2) 

shinyServer(function(input, output, session) { 
     output$mytabs <- renderUI({ 
      nTabs = length(input$decision) 
      myTabs = lapply(paste('dataset', 1:nTabs), tabPanel) 
      do.call(tabsetPanel, myTabs) 
     }) 
}) 

ui.R을 : 그래서, 예를 들어, ui.R에서 말하는, 사용자는 그들이보고 싶어하는 데이터 세트 선택할 수있는 선택의 여지가있다

그래서, 해당 데이터 세트를 각 탭 아래의 데이터 테이블로 별도로 렌더링하고 싶습니다.

도움을 주셔서 감사합니다.

답변

3

원하는대로하려면 tabPanel에 동적으로 생성 할 때 dataTableOutput을 추가해야합니다. 그런 다음 해당하는 renderDataTable을 동적으로 생성해야합니다.

서버에서이 작업을 수행 :

library(DT) # need datatables package 
server <- shinyServer(function(input, output, session) { 

    output$mytabs <- renderUI({ 
    nTabs = length(input$decision) 
    # create tabPanel with datatable in it 
    myTabs = lapply(seq_len(nTabs), function(i) { 
     tabPanel(paste0("dataset_",i), 
     DT::dataTableOutput(paste0("datatable_",i))  
       ) 
     }) 

    do.call(tabsetPanel, myTabs) 
    }) 

    # create datatables 
    observe(
    lapply(seq_len(length(input$decision)), function(i) { 
     output[[paste0("datatable_",i)]] <- DT::renderDataTable({ 
     as.data.frame(get(input$decision[i])) 
     }) 
    }) 
) 
}) 
관련 문제