首页 > 解决方案 > DT:: Datatable 在闪亮的应用程序中显示两次

问题描述

我有一个shiny应用程序,dataTable当用户从侧边栏中的菜单中选择SectorA时,会显示 a 。radioButtons问题是它显示了两次。我也在浏览器模式下检查过。为什么会发生这种情况我在这里显示整个应用程序,因为它可能是由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" )
      ) 
    }
  })
}

标签: rdatatableshinydt

解决方案


看起来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")
      )
    }

也渲染一次表格。所以它看起来像 inside renderUIrenderDataTable只是创建输出而不需要dataTableOutput在 UI 中。

这似乎允许(无论好坏)轻松地在不同的选项卡中呈现不同的表格,而无需在 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")
      ) 
    }

推荐阅读