繁体   English   中英

在 R/Shiny 的引导卡中渲染 DT 数据表

[英]Render DT Datatables in Bootstrap Card in R/Shiny

下面是我的问题的最小可重现示例。 我需要做的是在引导卡内呈现数据表。 在下面的示例中, output$somethingMore的呈现就是这样做的。 然而,在我的真实世界的例子中,我有一个稍微复杂的场景,我无法像在那里那样将数据表传递给卡。

相反,我需要创建一个在我的output$brokenIdea示例中呈现的表格,然后将该对象放入卡片中。 当然,我下面的 brokenIdea 示例确实是错误的,或者可能比这更容易出错,因为这在概念上是一个坏主意。

但是,我希望看看是否有解决这个想法的方法,以便可以创建 output$brokenIdea,然后在 renderUI 中将其传递给卡。

对于那些可能会问为什么的人来说,这是需要的,因为我在现实世界的应用程序中有一个可编辑的 DT 表,并且(据我所知)能够像本例中那样编辑数据表, 需要观察者注意是否编辑浏览器中输出的表格。

我的代码中没有这些细节,但上面的示例确实显示了整体情况的上下文。

library(shiny)
library(bslib)
library(shinyWidgets)
library(DT)

card <- function(body, title) {
  div(class = "card",
    div(icon("chart-line", style = "color:white"), class = "card-header bg-success text-white text-center font-weight-bold", title),
    div(class = "card-body d-flex justify-content-center", body)
  )
}

ui <- fluidPage(

    navbarPage(
        theme = bs_theme(bootswatch = "flatly", version = 4),
        title = 'Methods',
        tabPanel('One'),
    ),
    mainPanel(
        h1('Hello World'),      
        
    uiOutput('something'),
    br(),
    DTOutput('somethingElse'),
    br(),
    uiOutput('somethingMore'),
    #uiOutput('brokenIdea')
        
    )
)

server <- function(input, output) {

    output$something <- renderUI({
        card('Test', 'Hello')
    })

    output$somethingElse <- renderDT({
        tab <- data.frame(x= rnorm(5), y = rnorm(5))
        DT::datatable(tab)
    })
    
    ### I could do this
    output$somethingMore <- renderUI({
        tab <- data.frame(x= rnorm(5), y = rnorm(5))
        out <- DT::datatable(tab)
        card(out, 'Hi')
    })
    
    ### But what I need is
    output$brokenIdea <- renderUI({
        card(output$somethingElse, 'Can this work')
    })
}

shinyApp(ui, server) 

将您的DTOutput('somethingElse')...)放入renderUI

library(shiny)
library(bslib)
library(shinyWidgets)
library(DT)

card <- function(body, title) {
    div(class = "card",
        div(icon("chart-line", style = "color:white"), class = "card-header bg-success text-white text-center font-weight-bold", title),
        div(class = "card-body d-flex justify-content-center", body)
    )
}

ui <- fluidPage(
    
    navbarPage(
        theme = bs_theme(bootswatch = "flatly", version = 4),
        title = 'Methods',
        tabPanel('One'),
    ),
    mainPanel(
        h1('Hello World'),      
        
        uiOutput('something'),
        br(),
        br(),
        uiOutput('somethingMore'),
        uiOutput('brokenIdea')
        
    )
)

server <- function(input, output) {
    
    output$something <- renderUI({
        card('Test', 'Hello')
    })
    
    tab <- reactive({
        invalidateLater(3000)
        data.frame(x= rnorm(5), y = rnorm(5))
    })
    output$somethingElse <- renderDT({
        DT::datatable(tab())
    })
    
    ### I could do this
    output$somethingMore <- renderUI({
        tab <- data.frame(x= rnorm(5), y = rnorm(5))
        out <- DT::datatable(tab)
        card(out, 'Hi')
    })
    
    ### But what I need is
    output$brokenIdea <- renderUI({
        card(DTOutput('somethingElse'), 'Can this work')
    })
}

shinyApp(ui, server) 

在我的示例中使用reactive来保存表格。 为了模拟表格动态变化,我让它每 5 秒改变一次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM