我正在使用this question作为向“闪亮”应用程序中的DT::datatable
添加“行索引”或“计数器列”(如数据表文档here中所述)的引用。目的是使表中的行名保持不变(1、2、3 ...),而不考虑对表进行的排序。
用户NicE通过转换数据表文档中的javascript代码以在DT::datatable
选项的回调中使用来回答了这个问题:
output$tbl = renderDataTable({
datatable(data, filter = "top", rownames=TRUE,options = list(
pageLength = 300, lengthMenu = c(100,200,300,400,500,600)
),
callback=JS("table.on( 'order.dt search.dt', function () {
table.column(0, {search:'applied', order:'applied'}).nodes().each( function (cell, i) {
cell.innerHTML = i+1;});}).draw();"))
})
如果我只在本地运行代码的datatable(...部分),这将很好地工作;但是,当我在Shiny应用程序的renderDataTable
中运行时,它将不起作用(行名恢复为原始排序)当您移至第一个页面以外的页面时)。根据上面链接的数据表文档中的注释,用户DeFKnoL识别出,如果您在表中的页面之间移动,这将无法正常工作-这是我运行我的计算机时的确切问题闪亮的应用程序。DeFKnoL的注释指出(“ deferRender”:true)会导致此问题-我尝试在DT::datatable
选项中将其更改为FALSE,但这不能解决问题。
我希望有人可以帮助我将此用户的javascript代码转换为可以输入DT::datatable
的回调选项的内容。
这是数据表文档中概述的原始方法中的javascript代码(NicE对其进行了修改以在回调中使用):
$(document).ready(function() {
var t = $('#example').DataTable( {
"columnDefs": [ {
"searchable": false,
"orderable": false,
"targets": 0
} ],
"order": [[ 1, 'asc' ]]
} );
t.on( 'order.dt search.dt', function () {
t.column(0, {search:'applied', order:'applied'}).nodes().each( function (cell, i) {
cell.innerHTML = i+1;
} );
} ).draw();
});
这是DeFKnoL的更新方法,解决了更改页面的问题:
$(document).ready(function() {
var t = $('#example').DataTable( {
"columnDefs": [ {
"searchable": false,
"orderable": false,
"targets": 0
} ],
"order": [[ 1, 'asc' ]]
} );
t.on( 'draw.dt', function () {
var PageInfo = $('#example').DataTable().page.info();
t.column(0, { page: 'current' }).nodes().each( function (cell, i) {
cell.innerHTML = i + 1 + PageInfo.start;
} );
} );
});
您可能会看到,NicE的JS()
输入与文档不完全匹配-而且我没有使用javascript的经验-因此我在实施此更改方面遇到了困难。添加“计数器列”可能比这简单得多,但是除了上面链接的原始问题之外,我没有运气找到任何其他方法。任何帮助将不胜感激!
答案 0 :(得分:1)
两种可能性:
1)使用server = FALSE
:
output$tbl <- renderDT({
datatable(data, filter = "top", rownames=TRUE,
options = list(
pageLength = 300, lengthMenu = c(100,200,300,400,500,600)
),
callback=JS("table.on( 'order.dt search.dt', function () {
table.column(0, {search:'applied', order:'applied'}).nodes().each( function (cell, i) {
cell.innerHTML = i+1;});}).draw();")
)
}, server = FALSE)
2)否则,这是DeFKnoL的方法:
js <- c(
"table.on('draw.dt', function(){",
" var PageInfo = table.page.info();",
" table.column(0, {page: 'current'}).nodes().each(function(cell,i){",
" cell.innerHTML = i + 1 + PageInfo.start;",
" });",
"})")
output$tbl <- renderDT({
datatable(data, filter = "top", rownames=TRUE,
options = list(
pageLength = 300, lengthMenu = c(100,200,300,400,500,600)
),
callback = JS(js)
)
})