![](/img/trans.png)
[英]Two dimensional dataframe cannot be displayed via DT::datatable() in a shiny app
[英]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")
)
}
也將表渲染一次。 因此,看起來好像在renderUI
, renderDataTable
只是創建輸出而無需在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.