web-dev-qa-db-ja.com

Shiny AppのDataTableから選択した行を取得する

このアプリケーションを変更したい:

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

一度に1行しか選択できず、データをプロットするために選択した行の最初の列の項目を取得できるようにするためです。誰もこれを行う方法を知っていますか?

20
evolvedmicrobe

UPDATE:input$tableId_rows_selectedserver.Rを使用して、選択した行にアクセスできるようになりました。詳細については、 here を参照してください。

一意の行を選択するには、例のコールバック関数を次のように変更できます。

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関数のコードを変更して、最初の列の数値を返すようにしました。

24
NicE

DataTableをレンダリングするRメソッドには、選択モードを定義するパラメーターがあります。例えば:

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

可能な値は次のとおりです(「複数」がデフォルトです)。

  • none
  • シングル
  • 複数

詳細については、以下を参照してください。 http://rstudio.github.io/DT/shiny.html

2016年4月14日編集

セットアップでは、single選択モードでの作業に問題があります。

使用するバージョンは次のとおりです。

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

私が直面した問題は、視覚的には単一の行を選択することですが、そうするとき:

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

選択されたが明示的に選択解除されなかったすべての行を含むリストが表示されます。つまり、新しい行を選択しても、内部Datatablesロジックの前の行が自動的に選択解除されることはありません。これは、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コードに送信されます。残念ながら、内部的にテーブルが選択された行を追跡し、ページを切り替えると間違った選択を復元するため、テーブルにはまだ問題があります。しかし、少なくともこれは単なる視覚的な欠陥であり、コードは適切に機能する可能性があります。したがって、このソリューションには実際により多くの作業が必要です。

12
Angel Naydenov

これは、投稿した例に対する直接的な解決策ではありませんが、別の例で答えを示します。

ダウンロード可能な光沢のあるアプリの例があり、次のリンクで説明されています ここをクリック !クラスパラメータを使用してテーブル内の単一行を選択するため。

1