标签之间的R闪亮构建链接

时间:2014-12-04 20:34:39

标签: javascript r shiny

[代码]

library(shiny)

server <- function(input, output) {
  output$iris_type <- renderDataTable({
    data.frame(Species=paste0("<a href='#filtered_data'>", unique(iris$Species), "</a>"))
  })
  output$filtered_data <- renderDataTable({iris})
}

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

shinyApp(ui = ui, server = server)

[问题]

我正在尝试将第一个标签页上的DataTable输出链接到第二个标签页。例如,当我点击setosa时,显示的下一个内容是第二个标签,iris数据集仅包含setosa。它应该从R:iris[iris$Species=="setosa",]执行这段代码。它也适用于Species中的其他iris

如何通过点击?

建立链接并运行该R命令

[答案更新]

如果你有不同的布局并且需要具体,那么你就可以做到这一点。

  1. 您的DataTable回调函数:

    callback =
    "function(table) {
       table.on('click.dt', 'tr', function() {
         Shiny.onInputChange('rows', table.row(this).data()[0] );
         $(\".tabbable .nav.nav-tabs li a:contains('Filtered Data')\").click();
       });
     }"
    
  2. 您的R代码:

    output$filtered_data <- renderDataTable({
      tagString <- input$rows
      rawTags <- gsub("</a>", "", gsub("<a href='#filtered_data'>", "", tagString))
    
      if (identical(tagString, character(0))) {
        iris
      } else {
        ...
      }
    })
    

1 个答案:

答案 0 :(得分:4)

在第一个表的行上使用click函数更容易。您可以添加回调 寻找表格行的点击。当观察到点击时,行索引被发送到闪亮的反应性输入:

library(shiny)

server <- function(input, output) {
  output$iris_type <- renderDataTable({
    data.frame(Species=paste0("<a href='#filtered_data'>", unique(iris$Species), "</a>"))
  },
  callback = "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 <- 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", dataTableOutput("iris_type")),
      tabPanel("Filtered Data", dataTableOutput("filtered_data"))
    )
  )
))

shinyApp(ui = ui, server = server)