文章目录

  • 简介
  • 代码示例
  • child row按钮的样式
    • 具有样式的childTable代码如下:

简介

Rshiny中的datatable可用于我们展示表格数据,但是总会遇到表格内容太多,需要折叠的情况,类似于下面图片所示:
绿色按钮点开之后,可以展示每一行折叠的详细信息。

表格每行内容的二级子行信息,就叫做 Child Row


代码示例

我参考了一位 外国博主的代码 , 来 shiny 中实现这样具有子信息的表格

childTable 是封装好的函数

childTable <- function(x, vars = NULL, opts = NULL, ...) {names_x <- names(x)if (is.null(vars)) stop("'vars' must be specified!")pos <- match(vars, names_x)pos <- pos[pos <= ncol(x)] + 1rownames(x) <- NULLif (nrow(x) > 0) x <- cbind(' ' = '&oplus;', x)# optionsopts <- c(opts,scrollX = TRUE,list(columnDefs = list(list(visible = FALSE, targets = c(0, pos)),list(orderable = FALSE, className = 'details-control', targets = 1),list(className = 'dt-left', targets = 1:3),list(className = 'dt-right', targets = 4:ncol(x)))))datatable(x,...,escape = F,options = opts,callback = JS(.callback2(x = x, pos = c(0, pos))))
}
.callback2 <- function(x, pos = NULL) {part1 <- "table.column(1).nodes().to$().css({cursor: 'pointer'});"part2 <- .child_row_table2(x, pos = pos)part3 <-"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('&ominus;');}});"paste(part1, part2, part3)
}
.child_row_table2 <- function(x, pos = NULL) {names_x <- paste0(names(x), ":")text <- "var format = function(d) {text = '<div><table>' +"for (i in seq_along(pos)) {text <- paste(text, glue::glue("'<tr>' +'<td>' + '{names_x[pos[i]]}' + '</td>' +'<td style=\"background-color:#eee; word-wrap:break-word;word-break:break-all; \">' + d[{pos[i]}] + '</td>' +'</tr>' + " ))}paste0(text,"'</table></div>'return text;};")
}

调用 childTable 函数,即可实现表格中插入子行
childTable 函数具有3个主要参数

  • x 即,我们data.frame的数据
  • vars 指x表格中,我们需要放在子行的那些数据的列名(本例中,我们想把 Age和 Employee ID列的数据放入子行)
  • opts 可以设置 pageLength 这些信息
  • 其它,可以使用datatable的参数

注: dt.csv文件是从 这个网址下载的示例文件

library(DT)
x <- read.csv("C:/Users/Administrator/Desktop/dt.csv")
x[["Employee ID"]] <- round(runif(nrow(x)) * 10000)
childTable(x = x,vars = c("Employee ID", "Age"),opts = list(pageLength = 5)
)

上述代码运行之后,得到的结果如图所示
点击圆圈里面带个+号的按钮,就可以直接展示二级子行的信息


child row按钮的样式

上面的代码虽然实现了二级子行信息的展示,但是按钮和二级表格颜色太朴素了,此时我们可以通过为 childTable 函数中的 td相关语句 添加CSS样式实现从朴素表格到华丽表格的转身

添加了按钮样式和二级表格信息背景颜色的 childTable 函数代码:
(1)首先是按钮的样式,我们直接用图片替代

(2)然后是二级表格的 Background,这个用CSS的style内置于HTML元素中即可

具有样式的childTable代码如下:


childTable <- function(x, vars = NULL, opts = NULL, ...) {names_x <- names(x)if (is.null(vars)) stop("'vars' must be specified!")pos <- match(vars, names_x)#if (any(map_chr(x[, pos], typeof) == "list"))#  stop("list columns are not supported in datatable2()")pos <- pos[pos <= ncol(x)] + 1rownames(x) <- NULLif (nrow(x) > 0) x <- cbind(' ' = '<img src=\"https://raw.githubusercontent.com/DataTables/DataTables/master/examples/resources/details_open.png\"/>', x)# optionsopts <- c(opts,scrollX = TRUE,list(columnDefs = list(list(visible = FALSE, targets = c(0, pos)),list(orderable = FALSE, className = 'details-control', targets = 1),list(className = 'dt-left', targets = 1:3),list(className = 'dt-right', targets = 4:ncol(x)))))datatable(x, ...,escape = F,options = opts,callback = JS(.callback2(x = x, pos = c(0, pos))))
}
.callback2 <- function(x, pos = NULL) {part1 <- "table.column(1).nodes().to$().css({cursor: 'pointer'});"part2 <- .child_row_table2(x, pos = pos)part3 <- "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('<img src=\"https://raw.githubusercontent.com/DataTables/DataTables/master/examples/resources/details_open.png\"/>');} else {row.child(format(row.data())).show();td.html('<img src=\"https://raw.githubusercontent.com/DataTables/DataTables/master/examples/resources/details_close.png\" />');}});"paste(part1, part2, part3)
}
.child_row_table2 <- function(x, pos = NULL) {names_x <- paste0(names(x), ":")text <- "var format = function(d) {text = '<div><table>' + "for (i in seq_along(pos)) {text <- paste(text, glue::glue("'<tr>' +'<td style=\"background-color:#ADD8E6; font-weight:bold\">' + '{names_x[pos[i]]}' + '</td>' +'<td style=\"background-color:#F8F8FF; word-wrap:break-word;word-break:break-all; \">' + d[{pos[i]}] + '</td>' +'</tr>' + " ))}paste0(text,"'</table></div>'return text;};")
}

此时我们把加入了样式的代码放入 shinyApp中实现之后,通过浏览器打开就是这样的:(注:Rstudio的viewer看不到图片按钮的效果,只有你把它放在ShinyApp中,部署好之后,用浏览器才能看到图片按钮 )

shiny datatable child row:shiny表格二级子行的展开与折叠相关推荐

  1. ZedGraph怎样实现将图形右键菜单的打印和页面设置合并为打印的二级子菜单

    场景 Winforn中实现ZedGraph自定义添加右键菜单项(附源码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...

  2. shiny html5代码,javascript – Shiny:如何正确包含Shiny HTML

    我想在一个Shiny应用程序中包含一个从Rmd生成的交互式文档.问题是Rmd包含两个Shiny应用程序. 这是.Rmd # myInteractiveDocument.Rmd ... ```{r,ec ...

  3. 关于mysql数据库的外键插入报错:Cannot add or update a child row: a foreign key constraint fails,完整性问题

    关于mysql的外键插入报错:Cannot add or update a child row: a foreign key constraint fails..... 首先确定sql语句的正确 然后 ...

  4. phpcms父级调用二级子栏目名称和二级栏目文章 - 代码篇

    phpcms父级调用二级子栏目名称和二级栏目文章 - 代码篇 后台栏目 · 层级 · 截图示下: 栏目catid9 包括以下二级栏目:catid{15,16,17,18,19} 截图暂略 代码示下: ...

  5. phpcmsV9导航高亮:调用任意的一级栏目,如何让选中的二级子栏目实现高亮显示?

    PHPCMS 实现选中栏目高亮的多种情况和方法 在phpcms开发中,会遇到各种导航中一级栏目的高亮显示,比如:顶部导航.侧边栏导航.以及对应二级子栏目的高亮显示,这里,我们探讨其中的情况之一:&qu ...

  6. Cannot add or update a child row: a foreign key constraint

    问题内容: 在一个hibernate项目中,为一个Model类添加一个多对一的配置,在进行功能调试的时候报如下错误. Caused by: com.mysql.jdbc.exceptions.MySQ ...

  7. table中的td表示table data(表格数据),tr表示table row(表格行),th表示table head(表格头)

    <table>中的 <td>表示table data(表格数据) <tr>表示table row(表格行) <th>表示table head(表格头)

  8. android二级菜单ui,巧用PopupMenu实现NavigationView的二级子菜单

    来简书的第一篇文章,想了想就以这个作为开头了^^ 概述 写自己的app时,发现NavigationView的默认菜单功能不支持类似OptionMenu那样点击后弹出二级子菜单的功能,思考了下想用Pop ...

  9. Cannot add or update a child row: a foreign key constraint fails都有哪些原因

    文章目录 前言 可能原因 1. 外键字段的数据类型 不匹配 2. 外键对应的表没有相应的数据 转载请标明出处: https://bigmaning.blog.csdn.net/article/deta ...

  10. JPA 数据库添加数据报错:Cannot add or update a child row: a foreign key constraint fails

    最近写jpa 的单项多对多,出现的错误,记录一下 java.sql.SQLIntegrityConstraintViolationException: Cannot add or update a c ...

最新文章

  1. Django-Migration admin.0001_initial is applied before its dependency accounts.0001_initial on....
  2. Redis集群管理(二)
  3. uCOS-II核心算法分析(μCOS-Ⅱ)
  4. SharePoint 权限提升(SPSecurity)
  5. 集成测试变得简单的第1部分:存储库测试
  6. php 防止不登录进入后台,php后台如何避免用户直接进入方法实例
  7. asp.net三层架构制作新闻管理_程序员蜕变为架构师必须要知道的「架构理论」...
  8. 【Oracle AWR详解分析-02】
  9. String replaceAll 方法的问题?
  10. 服务端访问Linux的DNS出现DNS request timed out..
  11. 数据结构PTA期末复习题集
  12. matlab做信号完整性,关于Matlab的Turbo码仿真研究
  13. 探究京东商城的数据建模
  14. C++过河(动态规划dp)
  15. 《Cocos Creator游戏实战》你画我猜中的画板功能
  16. NRF52832 WDT
  17. 用C#做床位一览功能(下)
  18. 诚之和:EDG夺冠,年轻人为何狂欢?
  19. spring 获取容器及容器中的对象
  20. 我们这一代人的困惑 --转自于宙TEDx大会上的演讲

热门文章

  1. 第一阶段冲刺阶段项目总结
  2. CMake 手册详解(七)
  3. eclipse alt+/ 无效时,如何设置 《转》
  4. java win8 mac地址_Win8系统查看mac地址的两种方法
  5. 中间弹框_Flutter AlertDialog弹框的基本使用概述
  6. nyoj(简单数学)Oh, my Paper!
  7. axios拦截器_Axios源码解析 —— 一个小而美的HttpClient
  8. python遍历链表_python实现双向循环链表
  9. 【SGU495】Kids and Prizes(概率dp)
  10. android asynctask源码分析,Android异步任务AsyncTask的使用与原理分析