fro*_*oam 4 javascript r datatables shiny dt
我使用这个问题作为参考,将“行索引”或“计数器列”(如数据表文档中所述)添加到闪亮DT::datatable的应用程序中。目的是保持表中的行名称常量(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();"))
})
Run Code Online (Sandbox Code Playgroud)
如果我仅在本地运行代码的 datatable(... 部分,则效果很好;但是,当我在renderDataTableShiny 应用程序中运行时,它不起作用(当您移动到除第一个)。根据上面链接的数据表文档中的评论,用户 DeFKnoL 发现如果您在表中的页面之间移动,这将无法正常工作 - 这正是我运行 Shiny 应用程序时出现的问题。DeFKnoL 的评论指出( "deferRender": true) 会导致问题 - 我尝试在选项中将其更改为 FALSE,DT::datatable但这并不能解决问题。
我希望有人可以帮助我将该用户的 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();
Run Code Online (Sandbox Code Playgroud)
} );
这是 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;
} );
} );
Run Code Online (Sandbox Code Playgroud)
} );
正如您可能看到的,NicE 的JS()输入与文档并不完全匹配 - 而且我没有使用 javascript 的经验 - 所以我在实现这一更改时遇到了困难。添加“计数器列”可能比这简单得多,但除了上面链接的原始问题之外,我没有找到任何方法。任何帮助,将不胜感激!
两种可能性:
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)
Run Code Online (Sandbox Code Playgroud)
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)
)
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1041 次 |
| 最近记录: |