簡體   English   中英

DT ::數據表在閃亮的應用程序中顯示兩次

[英]DT:: Datatable is displayed twice in a shiny application

我有一個shiny應用程序,當用戶從側邊欄中的radioButtons菜單中選擇Sector A時,將顯示一個dataTable 問題是它顯示兩次。 我也在瀏覽器模式下檢查過它。 為什么會發生這種情況,我在這里顯示整個應用程序,因為它可能是由應用程序的if邏輯引起的。 renderTable()可以正常工作,所以我認為DT存在問題

#ui.r
library(shiny)
library(shinythemes)  
library(DT)

ui <- fluidPage(
  theme=shinytheme("slate") ,
  # App title ----
  titlePanel("Tabsets"),

  # Sidebar layout with input and output definitions ----
  sidebarLayout(

    # Sidebar panel for inputs ----
    sidebarPanel(
      uiOutput("rad")
    ),

    # Main panel for displaying outputs ----
    mainPanel(
      uiOutput("tabers"),
      DT::dataTableOutput("table")
    )
  )
)
#server.r
library(shiny)
library(DT)
server = function(input, output) {

  output$rad<-renderUI({
    radioButtons("radio", label = "",
                 choices = list("Home"=1,"About" = 2, "Sector A" = 3, "Sector B" = 4,"Sector C" = 5), 
                 selected = 1)
                 #selected = character(0))
  })

  output$tabers<-renderUI({
    if(is.null(input$radio)) {
      tabsetPanel(
        id="tabF",
        type = "tabs",
        tabPanel("Global"),
        tabPanel("Performance")
      )
    }
    else if(input$radio==3){
      tabsetPanel(
        id="tabC",
        type = "tabs",
        tabPanel("Constituents",
                 output$table <- renderDataTable({
                   mtcars
                 })
                 ),
        tabPanel("Clusters" ),
        tabPanel("Index")
      )
    }
    else if(input$radio==4){
      tabsetPanel(
        id="tabD",
        type = "tabs",
        tabPanel("Constituents"

                 ),
        tabPanel("Clusters" ),
        tabPanel("Index")
      ) 
    }
    else if(input$radio==5){
      tabsetPanel(
        id="tabE",
        type = "tabs",
        tabPanel("Constituents"

                 ),
        tabPanel("Clusters" ),
        tabPanel("Index")
      ) 
    }
    else if(input$radio==2){

    }
    # Left last else in here but should not get called as is
    else if(input$radio==1){
      tabsetPanel(
        id="tabA",
        type = "tabs",
        tabPanel("Global"),
        tabPanel("Performance" )
      ) 
    }
  })
}

看起來renderTable做同樣的事情。 由於某種原因, renderDataTable({mtcars})的輸出顯示兩次,第一次通過uiOutput ,第二次通過dataTableOutput() (均在mainPanel )。 注釋行dataTableOutput("table")解決此問題,因為該行為僅顯示表一次。 有趣的是,像這樣刪除任務:

else if(input$radio==3){
      tabsetPanel(
        id="tabC",
        type = "tabs",
        tabPanel("Constituents",
                 renderDataTable({
                   mtcars
                 })
        ),
        tabPanel("Clusters" ),
        tabPanel("Index")
      )
    }

也將表渲染一次。 因此,看起來好像在renderUIrenderDataTable只是創建輸出而無需在UI中使用dataTableOutput

這似乎允許(無論好壞)容易地在不同的選項卡中呈現不同的表,而無需在UI中使用相應的輸出條目。

else if(input$radio==3){
      tabsetPanel(
        id="tabC",
        type = "tabs",
        tabPanel("Constituents",
                 renderDataTable({
                   mtcars
                 })
        ),
        tabPanel("Clusters" ),
        tabPanel("Index")
      )
    }
    else if(input$radio==4){
      tabsetPanel(
        id="tabD",
        type = "tabs",
        tabPanel("Constituents",
                 renderDataTable({
                   iris
                 })
        ),
        tabPanel("Clusters" ),
        tabPanel("Index")
      ) 
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM