从Shiny App中的DataTable获取所选行

evo*_*obe 21 r shiny

我想修改这个应用程序:

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

这样一次只能选择一行,这样我就可以获取所选行的第一列中的项目来绘制数据.有谁知道如何做到这一点?

Nic*_*icE 23

更新:您现在可以使用input$tableId_rows_selectedin 访问所选行server.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]);
      });
    }"
Run Code Online (Sandbox Code Playgroud)

当您单击某一行时,它基本上会删除所有选定的行(它们具有.selected类)并选择您单击的行.

我还更改了Shiny.onInputChange函数中的代码,以便它返回第一列中的数字.


Ang*_*nov 14

呈现DataTable的R方法具有定义选择模式的参数.例如:

output$table1 <-
  DT::renderDataTable(dataSet,
                      selection = 'single')
Run Code Online (Sandbox Code Playgroud)

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

  • 没有

有关进一步参考,请参阅:http://rstudio.github.io/DT/shiny.html

编辑2016年4月14日

在我使用单一选择模式的设置中存在问题.

这是我使用的版本:

> DT:::DataTablesVersion
[1] "1.10.7"
> packageVersion("DT")
[1] ‘0.1’
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是视觉上你有一行选择,但是当你这样做时:

observeEvent(input$table1_rows_selected, {
  str(input$table1_rows_selected)
})
Run Code Online (Sandbox Code Playgroud)

您将获得一个列表,其中包含已选中但未明确取消选择的所有行.换句话说,选择新行不会自动取消选择内部数据表逻辑中的上一行.这可能也是由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);
});
Run Code Online (Sandbox Code Playgroud)

一旦你有了这个,你将能够做到:

observeEvent(input$table1_selected_id, {
  str(input$table1_selected_id)
})
Run Code Online (Sandbox Code Playgroud)

现在至少将正确的数据发送到您的服务器.R代码.不幸的是,您仍然会遇到表的问题,因为在内部它会跟踪选择哪些行,如果您切换页面,它将恢复错误的选择.但至少这纯粹是一个视觉缺陷,你的代码将有机会正常运行.所以这个解决方案实际上需要更多工

  • 如果您知道您正在处理单选,则可以使用“_row_last_clicked” (2认同)

小智 5

你可以使用这个:

output$data_table <- renderDataTable(data(),options = list(pageLength = 9))
Run Code Online (Sandbox Code Playgroud)

然后获取所选行:

selected <- input$data_table_rows_selected
Run Code Online (Sandbox Code Playgroud)

然后,要从该行获取单元格,您可以使用(假设 time 是您在本例中尝试获取的列的名称):

time_x = data()[selected, "time"]
Run Code Online (Sandbox Code Playgroud)

Selected 是所选行的索引,因此您需要将该索引与列名称一起使用。