带有 DT 包的选项卡之间的 R 闪亮构建链接

Posted

技术标签:

【中文标题】带有 DT 包的选项卡之间的 R 闪亮构建链接【英文标题】:R shiny build links between tabs with DT package 【发布时间】:2015-06-30 10:48:09 【问题描述】:

在R shiny build links between tabs 找到的选项卡之间创建链接的解决方案非常好,但它不适用于 DT 包(对我来说......)。 谁能告诉我,与没有 DT 包的解决方案相比,我在使用 DT 库的示例代码中做错了什么?

library(shiny)
library(DT)

server <- function(input, output) 
    output$iris_type <- DT::renderDataTable(
        datatable(data.frame(Species=paste0("<a href='#filtered_data'>", unique(iris$Species), "</a>")),
                  escape = FALSE,
                  options = list(initComplete = JS(
'function(table) 
    table.on("click.dt", "tr", function() 
    Shiny.onInputChange("rows", table.row( this ).index());
    tabs = $(".tabbable .nav.nav-tabs li a");
    $(tabs[1]).click();
    );
')))
    )

  output$filtered_data <- DT::renderDataTable(
      if(is.null(input$rows))
          iris
      else
          iris[iris$Species %in% unique(iris$Species)[as.integer(input$rows)+1], ]
      
      )
  

ui <- shinyUI(fluidPage(
    mainPanel(
        tabsetPanel(
            tabPanel("Iris Type", DT::dataTableOutput("iris_type")),
            tabPanel("Filtered Data", DT::dataTableOutput("filtered_data"))
        )
    )
))

shinyApp(ui = ui, server = server)

【问题讨论】:

【参考方案1】:

你可以试试下面的代码。我将切换选项卡的函数更改为回调(将表作为参数)并在您的output$filtered_data 中,将iris 替换为datable(iris),因为您正在使用DT::renderDataTable 进行渲染

library(shiny)
library(DT)

server <- function(input, output) 
  output$iris_type <- DT::renderDataTable(
    datatable(data.frame(Species=paste0("<a href='#filtered_data'>", unique(iris$Species), "</a>")),
              escape = FALSE,
              callback = JS(
                'table.on("click.dt", "tr", function() 
    tabs = $(".tabbable .nav.nav-tabs li a");
    $(tabs[1]).click();)'))
  )

  output$filtered_data <- DT::renderDataTable(
    selected <- input$iris_type_rows_selected
    if(is.null(selected))
      datatable(iris)
     else 
      datatable(iris[iris$Species %in% unique(iris$Species)[selected], ])
    
  )


ui <- shinyUI(fluidPage(
  mainPanel(
    tabsetPanel(
      tabPanel("Iris Type", DT::dataTableOutput("iris_type")),
      tabPanel("Filtered Data", DT::dataTableOutput("filtered_data"))
    )
  )
))

shinyApp(ui = ui, server = server)

请注意,这需要DT >= 0.0.62。

【讨论】:

【参考方案2】:

最后,我在 onclick 事件上使用了一个小技巧。你觉得哪种方式更清楚? (Nice 的还是这个?)

library(shiny)
library(DT)

server <- function(input, output) 
    output$iris_type <- DT::renderDataTable(
        datatable(data.frame(Species=paste0("<a href='#filtered_data'",
                                            "alt='",unique(iris$Species),"'",                                                 
                                            "onclick=\"",
                                            "tabs = $('.tabbable .nav.nav-tabs li');",
                                            "tabs.each(function() ",
                                            "$(this).removeClass('active')",
                                            ");",
                                            "$(tabs[1]).addClass('active');",
                                            "tabsContents = $('.tabbable .tab-content .tab-pane');",
                                            "tabsContents.each(function() ",
                                            "$(this).removeClass('active')",
                                            ");",
                                            "$(tabsContents[1]).addClass('active');",
                                            "$('#filtered_data').trigger('change').trigger('shown');",
                                            "Shiny.onInputChange('species', getAttribute('alt'));",
                                            "\">",
                                            unique(iris$Species),
                                            "</a>")),
                  escape = FALSE)
    )

    output$filtered_data <- DT::renderDataTable(
        if(is.null(input$species))
            datatable(iris)
        else
            datatable(iris[iris$Species %in% input$species, ])
        
    )
    

ui <- shinyUI(fluidPage(
    mainPanel(
        tabsetPanel(
            tabPanel("Iris Type", DT::dataTableOutput("iris_type")),
            tabPanel("Filtered Data", DT::dataTableOutput("filtered_data"))
        )
    )
))

shinyApp(ui = ui, server = server)

【讨论】:

以上是关于带有 DT 包的选项卡之间的 R 闪亮构建链接的主要内容,如果未能解决你的问题,请参考以下文章

根据 tabPanel 选择从数据库获取数据。闪亮

R闪亮的动态DT数据表记住过滤器/排序

闪亮的 R 渲染图

在带有 R 闪亮的 selectizeInput 中使用 html

闪亮:从闪亮的应用程序中打开新的浏览器选项卡

R闪亮仪表板中标题中的主页按钮