从 Shiny App 中的数据表中获取选定的行
Get Selected Row From DataTable in Shiny App
我要修改这个应用:
https://demo.shinyapps.io/029-row-selection/
这样一次只能选择一行,这样我就可以获取所选行第一列中的项目来绘制数据。有人知道怎么做吗?
更新: 您现在可以使用 server.R
中的 input$tableId_rows_selected
访问 selected 行。有关详细信息,请参阅 here。
要select一个独特的行,您可以将示例的回调函数更改为:
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 行(它们有 .selected class)和 selects 你的行点击了。
我还更改了 Shiny.onInputChange 函数中的代码,使其 returns 第一列中的数字。
以下代码以 DT table 格式显示数据帧。用户将能够 select 单行。检索并显示 selected 行。您可以在服务器的绘图块中编写绘图函数。
希望对您有所帮助!!
# 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
呈现 DataTable 的 R 方法有一个定义选择模式的参数。例如:
output$table1 <-
DT::renderDataTable(dataSet,
selection = 'single')
可能的值为('multiple' 是默认值):
- none
- 单身
- 多个
如需进一步参考,您可以查看:http://rstudio.github.io/DT/shiny.html
编辑 2016 年 4 月 14 日
在我使用单一选择模式的设置中有问题。
这是我使用的版本:
> 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 代码发送正确的数据。不幸的是,您仍然会遇到 table 的问题,因为它在内部跟踪选择了哪些行,如果您切换页面,它将恢复错误的选择。但至少这纯粹是一个视觉缺陷,您的代码将有机会正常运行。所以这个解决方案实际上需要更多的工作。
你可以使用这个:
output$data_table <- renderDataTable(data(),options = list(pageLength = 9))
然后获取选中的行:
selected <- input$data_table_rows_selected
然后要从该行获取单元格,您可以使用(假设时间是您在这种情况下尝试获取的列的名称):
time_x = data()[selected, "time"]
Selected 是所选行的索引,因此您需要将该索引与列名称一起使用。
我要修改这个应用:
https://demo.shinyapps.io/029-row-selection/
这样一次只能选择一行,这样我就可以获取所选行第一列中的项目来绘制数据。有人知道怎么做吗?
更新: 您现在可以使用 server.R
中的 input$tableId_rows_selected
访问 selected 行。有关详细信息,请参阅 here。
要select一个独特的行,您可以将示例的回调函数更改为:
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 行(它们有 .selected class)和 selects 你的行点击了。
我还更改了 Shiny.onInputChange 函数中的代码,使其 returns 第一列中的数字。
以下代码以 DT table 格式显示数据帧。用户将能够 select 单行。检索并显示 selected 行。您可以在服务器的绘图块中编写绘图函数。
希望对您有所帮助!!
# 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
呈现 DataTable 的 R 方法有一个定义选择模式的参数。例如:
output$table1 <-
DT::renderDataTable(dataSet,
selection = 'single')
可能的值为('multiple' 是默认值):
- none
- 单身
- 多个
如需进一步参考,您可以查看:http://rstudio.github.io/DT/shiny.html
编辑 2016 年 4 月 14 日
在我使用单一选择模式的设置中有问题。
这是我使用的版本:
> 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 代码发送正确的数据。不幸的是,您仍然会遇到 table 的问题,因为它在内部跟踪选择了哪些行,如果您切换页面,它将恢复错误的选择。但至少这纯粹是一个视觉缺陷,您的代码将有机会正常运行。所以这个解决方案实际上需要更多的工作。
你可以使用这个:
output$data_table <- renderDataTable(data(),options = list(pageLength = 9))
然后获取选中的行:
selected <- input$data_table_rows_selected
然后要从该行获取单元格,您可以使用(假设时间是您在这种情况下尝试获取的列的名称):
time_x = data()[selected, "time"]
Selected 是所选行的索引,因此您需要将该索引与列名称一起使用。