簡體   English   中英

在 Shiny App 中從 DataTable 中獲取選定的行

[英]Get Selected Row From DataTable in Shiny App

我想修改這個應用程序:

https://demo.shinyapps.io/029-row-selection/

這樣一次只能選擇一行,這樣我就可以獲取所選行的第一列中的項目來繪制數據。 有誰知道如何做到這一點?

更新:您現在可以訪問使用選定的行input$tableId_rows_selectedserver.R 請參閱此處了解更多詳情。

要選擇唯一行,您可以將示例的回調函數更改為:

callback = "function(table) {
      table.on('click.dt', 'tr', function() {
            table.$('tr.selected').removeClass('selected');
            $(this).toggleClass('selected');            
        Shiny.onInputChange('rows',
                            table.rows('.selected').data()[0][0]);
      });
    }"

當您單擊一行時,它基本上會刪除任何選定的行(它們具有 .selected 類)並選擇您單擊的行。

我還更改了 Shiny.onInputChange 函數中的代碼,以便它返回第一列中的數字。

呈現 DataTable 的 R 方法有一個定義選擇模式的參數。 例如:

output$table1 <-
  DT::renderDataTable(dataSet,
                      selection = 'single')

可能的值是('multiple' 是默認值):

  • 沒有任何
  • 單身的

如需進一步參考,您可以查看: http : //rstudio.github.io/DT/shiny.html

編輯 04/14/2016

在我使用的單選模式設置中存在問題。

這是我使用的版本:

> DT:::DataTablesVersion
[1] "1.10.7"
> packageVersion("DT")
[1] ‘0.1’

我面臨的問題是,在視覺上你有一個單行選擇,但是當你這樣做時:

observeEvent(input$table1_rows_selected, {
  str(input$table1_rows_selected)
})

您將獲得一個包含所有已選擇但未明確取消選擇的行的列表。 換句話說,選擇新行不會自動取消選擇內部數據表邏輯中的前一行。 這也可能是由於 DT 包裝器,不確定。

這就是為什么目前我們使用 JS 作為一種解決方法:

$(document).on('click', '#table1 table tr', function() {
    var selectedRowIds = $('#table1 .dataTables_scrollBody table.dataTable').DataTable().rows('.selected')[0];

    var selectedId = "";
    if (selectedRowIds.length === 1) {
        selectedId = $(this).children('td:eq(0)').text();
    } else {
      $('#table1 tbody tr').removeClass('selected');
    }
    Shiny.onInputChange("table1_selected_id", selectedId);
});

完成此操作后,您將能夠執行以下操作:

observeEvent(input$table1_selected_id, {
  str(input$table1_selected_id)
})

這現在至少將正確的數據發送到您的 server.R 代碼。 不幸的是,您仍然會遇到表格問題,因為它在內部跟蹤選擇了哪些行,如果您切換頁面,它將恢復錯誤的選擇。 但至少這純粹是一個視覺缺陷,您的代碼將有機會正常運行。 所以這個解決方案實際上需要更多的工作。

下面的代碼以 DT 表格式顯示數據幀。 用戶將能夠選擇單行。 檢索並顯示所選行。 您可以在服務器的繪圖塊中編寫繪圖函數。

我希望這有幫助 !!

         # Server.R
         shinyServer(function(input, output,session) {




          output$sampletable <- DT::renderDataTable({
          sampletable
          }, server = TRUE,selection = 'single')  

          output$selectedrow <- DT::renderDataTable({

          selectedrowindex <<-     input$sampletable_rows_selected[length(input$sampletable_rows_selected)]
         selectedrowindex <<- as.numeric(selectedrowindex)
         selectedrow <- (sampletable[selectedrowindex,])
         selectedrow



           })

          output$plots <- renderPlot({

          variable <- sampletable[selectedrowindex,1]
          #write your plot function


              })


          })

          #ui.R 
          shinyUI(navbarPage( "Single Row Selection",



                tabPanel("Row selection example",
                         sidebarLayout(sidebarPanel("Parameters"),
                             mainPanel(
                               DT::dataTableOutput("selectedrow"),   
                             DT::dataTableOutput("sampletable")

                           ))

                      )

                      ))

         # global.R 

        library(DT)
        library(shiny)
        selectedrowindex = 0

你可以使用這個:

output$data_table <- renderDataTable(data(),options = list(pageLength = 9))

然后獲取選定的行:

selected <- input$data_table_rows_selected

然后要從該行獲取單元格,您可以使用(假設 time 是您在這種情況下嘗試獲取的 col 的名稱):

time_x = data()[selected, "time"]

Selected 是所選行的索引,因此您需要將該索引與列名稱一起使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM