展开和折叠闪亮数据表中的子行

2024-03-19

我在复制 Shiny 中的数据表对象时遇到问题。目前,当我在 Shiny 环境之外运行代码的数据表部分时,我可以显示我想要的内容。但是,当我运行整个代码时,它没有显示子表。

library(DT)
library(data.table)
library(shiny)

shinyApp(
 ui = fluidPage(DT::dataTableOutput('tbl')),
 server = function(input, output) {
 output$tbl = DT::renderDataTable(

  datatable({
    #Transform dataframe to data.table and turn the dataframe rowname into a data.table column called model
    mtcars_dt = data.table(mtcars)
    mtcars_dt[["model"]] = rownames(mtcars)
    setcolorder(mtcars_dt,c(
      which(colnames(mtcars_dt) %in% c("mpg","cyl","model")),
      which(!colnames(mtcars_dt) %in% c("mpg","cyl","model"))
    ))

    #Turn data table into a nested data.table by mpg, cyl
    mtcars_dt <- mtcars_dt[, list(cars=list(.SD)), by = list(mpg,cyl)]


    #configure datatable. Hide row number and cars columns [0,4] and enable details control on plus sign column[1]
    #turn rows into child rows and remove from parent
    cbind(' ' = '&oplus;', mtcars_dt)}, 

    escape = -2,
    options = list(
      columnDefs = list(
        list(visible = FALSE, targets = c(0,4)),
        list(orderable = FALSE, className = 'details-control', targets = 1)
      )
    ),
    callback = JS("
                  table.column(1).nodes().to$().css({cursor: 'pointer'});

                  // Format cars object into another table
                  var format = function(d) {
                  if(d != null){ 
                  var result = ('<table id=\"child_' + d[2] + '_' + d[3] + '\">').replace('.','_') + '<thead><tr>'
                  for (var col in d[4]){
                  result += '<th>' + col + '</th>'
                  }
                  result += '</tr></thead></table>'
                  return result
                  }else{
                  return '';
                  }
                  }

                  var format_datatable = function(d) {
                  var dataset = [];
                  for (i = 0; i < + d[4]['model'].length; i++) {
                  var datarow = [];
                  for (var col in d[4]){
                  datarow.push(d[4][col][i])
                  }
                  dataset.push(datarow)
                  }
                  var subtable = $(('table#child_' + d[2] + '_' + d[3]).replace('.','_')).DataTable({
                  'data': dataset,
                  'autoWidth': true, 
                  'deferRender': true, 
                  'info': false, 
                  'lengthChange': false, 
                  'ordering': true, 
                  'paging': false, 
                  'scrollX': false, 
                  'scrollY': false, 
                  'searching': false 
                  });
                  };

                  table.on('click', 'td.details-control', function() {
                  var td = $(this), row = table.row(td.closest('tr'));
                  if (row.child.isShown()) {
                  row.child.hide();
                  td.html('&oplus;');
                  } else {
                  row.child(format(row.data())).show();
                  td.html('&CircleMinus;');
                  format_datatable(row.data())
                  }
                  });")
      )
    )
  }
)

感谢您的帮助!


这里的关键似乎是对象和数组之间的区别。使用闪亮时,row.data()是一个数组,它的第五个元素也是一个数组(这里我单击了主表中的第二行):

["2", "&oplus;", 22.8, 4, Array(2)]

在光鲜亮丽的环境之外,row.data()看起来像这样:

["2", "&oplus;", 22.8, 4, Object]

正如你所看到的,第五个元素是一个对象!为什么会这样,我也说不出来。我想幕后使用的库的版本可能有所不同。

为了使其正常工作,我们需要进行 2 项更改:

1. 改变format():


var format = function(d) {
  if(d != null) { 
    var result = ('<table id=\"child_' + d[2] + '_' + d[3] + '\">').replace('.','_') + '<thead><tr>'
    for (var col in d[4][0]) {
       result += '<th>' + col + '</th>'
    }
    result += '</tr></thead></table>'
    return result
  } else {
    return '';
  }
}

这里我们刚刚添加了[0]第 4 行。如上所示,d[4]是一个数组。对于第二行数据,它由 2 个对象组成。(var col in d[4])会回来0 and 1(对象的索引)而(var col in d[4][0])返回第一个对象的元素(即列名称)。

2. 改变format_datatable():


var format_datatable = function(d) {
  var dataset = [];
  for (i = 0; i <=  d[4].length-1; i++) {
    var datarow = $.map(d[4][i], function(value, index) {
      return [value];
    });
    dataset.push(datarow);
  }
  //  ...
  //  the rest did not change
}

这里我们转换每个汽车模型(所以每个元素d[4]),它被表示为一个对象,使用$.map()。之后我们只需将这个数组添加到dataset.

创建子表的代码需要这些数组。 DataTables 处理数据的方式不同,可以检查其类型here https://datatables.net/manual/data/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

展开和折叠闪亮数据表中的子行 的相关文章

随机推荐

  • 使用 babel 递归地转译服务器文件

    我的文件夹结构是这样的 functions dist private server controllers middleware clientAuth js someOtherAuth js index js model js router
  • Highcharts 日期相差一天

    我以毫秒为单位传递 x 轴 然后将 x 轴定义为 xAxis type datetime 然而 Highcharts 似乎没有在 x 轴上获得准确的日期 而是相差一天 为了说明这一点 将鼠标悬停在任何条形图上 在这篇文章的底部拨弄 您将看到
  • mockito 的学习资源 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我需要使用mockito为现有代码创建单元测试框架 我找不到一个开始学习 Mockito 的好地方 你能给我推荐一个很好的mockito学
  • 在缓存图像上触发 load() 事件的更好方法是什么?

    我正在编写一个脚本 该脚本等待隐藏内容加载div在激活指向它的缩略图之前 preload img first child bind load activateThumb each function if this complete this
  • 如何获取属性的串联值?

    XPath 表达式 div concat id class 失败并出现错误 The expression is not a legal expression 在 Firefox 25 0 中 来自用户脚本 为什么 以及如何解决 对于输入 d
  • 如何通过 MediaWiki API 从 Wikipedia 文章中获取信息框? [复制]

    这个问题在这里已经有答案了 维基百科文章可能有信息框模板 通过以下调用 我可以获得包含信息框的文章的第一部分 http en wikipedia org w api php action parse pageid 568801 sectio
  • 使用 sed 将文件中的字符串替换为该名称的变量的内容

    我正在尝试使用 sed 将 XXX 形式的文件中的模板字符串替换为 shell 脚本中名为 XXX 的变量的值 例如以下完美运行 sed s user home user home gi So if user home fred下列 Nam
  • 使用log4j2,如何记录键值对

    我需要创建带有键值对的日志 如下所示 PatternLayout 是否支持使用 log4j2 xml 对线程中的静态字段 如 log level class name event id 等 执行此操作 日志样本 2014 06 18 11
  • Power BI 图表中的自定义排序

    最近我遇到一个问题 我需要按照我在 PowerBi 报告中定义的方式显示列顺序 问题是 PowerBI 按升序 A gt Z 或降序 Z gt A 对列进行排序 那么如果必须应用他的自定义顺序 他应该如何实现这一目标 Here is and
  • Azure 云上的开发、暂存和生产环境

    我正在开发的应用程序需要三个环境 一个开发环境 其中最新版本的代码 在每次提交上构建 和测试发生 我们合并开发和测试环境以提高效率 我们有一个临时环境 用于产品演示和演示 以及具有实时数据和客户的生产环境 现在 这将如何映射到 Azure
  • Julia:大型数组的打印有限

    我使用脚本文件在 Julia 中生成了许多大型数组 打印整个数组很麻烦 但我想检查前几行是否有意义 我知道 REPL 中的打印受到屏幕尺寸的限制 例如 julia gt zeros 1000 10 1000 10 Array Float64
  • Java中解析远程文件的FLV头(持续时间)

    我正在寻找一个专门在 Java 中解析 FLV 标头持续时间的示例 给定 FLV 文件的 URL 我只想下载标头并解析出持续时间 我有 FLV 规范 但我想要一个示例 Python 或 PHP 也可以 但首选 Java 您在下载标头或解析标
  • Phoenix:使用 Content-Type: application/json 处理 POST 请求正文

    我想处理传入的 POSTapplication json内容类型 我只是想返回发布的 JSON 作为对测试的响应 如下所示 WebhookController 控制器 pipeline api do plug accepts json en
  • 如何在 timeFormat d3 中添加自定义值?

    我有一个数据集 日期指定为date Q3 1954 Q4 1954 Q1 1955 Q2 1955 Q3 1955 Q4 1955 Q3 1955 Q4 1955 Q1 1956 我希望它位于 x 轴上并且数据点对应于每个日期 D3 v4
  • 将焦点设置在功能组件中的特定按钮上的反应方式?

    您好 我是新来反应的 在我的页面加载上 我需要将焦点放在按钮上 我正在使用功能组件 我看过类组件的示例 其中使用 componentDidMount 并使用 refs 设置焦点 这里我使用功能组件 也没有使用 ComponentDidMou
  • __init__() 收到意外的关键字参数“inputs”

    class Model def init self self model Sequential self model add Conv2D 24 3 2 valid input shape 75 75 3 self model add Ba
  • TypeScript 项目中缺少基本 DOM 类型

    我正在使用 TypeScript 设置一个 Web 应用程序 但我似乎缺少一些我需要的基本类型 当我编译时 npm run build 我收到以下错误 错误 TS2304 找不到名称 HTMLElement 错误 TS2304 找不到名称
  • XCode 不会将子目录中的 C++ 源文件添加到编译源中

    我使用 XCode 5 1 进行 C 开发 我有现有代码 通过从 Finder 拖动文件将其添加到项目中 该项目显示了所有必要的 h and cpp文件 但是当我点击Build Phases gt Compile Sources 我只看到来
  • 在 PHP 中从多维数组构建路径

    我有一个数组 例如 tree array folder 1 gt array folder 1 1 folder 1 2 gt array folder 1 2 1 folder 1 2 2 folder 1 3 folder 2 gt a
  • 展开和折叠闪亮数据表中的子行

    我在复制 Shiny 中的数据表对象时遇到问题 目前 当我在 Shiny 环境之外运行代码的数据表部分时 我可以显示我想要的内容 但是 当我运行整个代码时 它没有显示子表 library DT library data table libr