2015-04-22 103 views
4

解决方案之间创建链接之间的标签找到这里R shiny build links between tabs是非常好的,但它不适用于DT包(对我来说)。 任何人都可以告诉我,我的示例代码中使用DT库与没有DT包的解决方案相比,我做错了什么?R闪亮的链接标签与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) 

回答

3

你可以试试下面的代码。我改变了功能切换标签的回调(其表作为参数),并在你的output$filtered_data,取而代之的datable(iris)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

1

最后我在onclick事件上使用了一点小技巧。你认为哪种方式更清楚? (NicE's还是这个?)

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)