如何在R语言DT包的DataTable中仅允许单行渲染HTML实体
解决方案
DT包的escape参数本身不支持按行配置转义规则,可以通过以下两种方案实现需求:
方案1:R端预处理数据(适合小数据量场景)
先手动转义除首行外的所有内容,再关闭全表转义即可,无需修改JS配置:
library(DT) library(htmltools) # 构造原始数据 m = matrix(c( '<b>Bold</b>', '<em>Emphasize</em>', '<a href="http://rstudio.com">RStudio</a>', '<a href="#" onclick="alert(\'Hello World\');">Hello</a>' ), 2) colnames(m) = c('<span style="color:red">Column 1</span>', '<em>Column 2</em>') # 转义首行之外的所有内容 m[-1, ] <- apply(m[-1, , drop = FALSE], 2, function(col) { sapply(col, htmlEscape) }) # 关闭全表转义,此时只有未转义的首行会渲染HTML datatable(m, escape = FALSE)
方案2:前端自定义渲染逻辑(适合大数据量场景)
通过JS渲染函数按行索引判断是否转义,不需要修改原始数据:
library(DT) m = matrix(c( '<b>Bold</b>', '<em>Emphasize</em>', '<a href="http://rstudio.com">RStudio</a>', '<a href="#" onclick="alert(\'Hello World\');">Hello</a>' ), 2) colnames(m) = c('<span style="color:red">Column 1</span>', '<em>Column 2</em>') datatable(m, escape = FALSE, options = list( columnDefs = list(list( targets = "_all", render = JS( "function(data, type, row, meta) {", " // 行索引从0开始计数,大于0的行做转义处理", " if(meta.row > 0) {", " return $('<div/>').text(data).html();", " }", " return data;", "}" ) )) ) )
如果不需要渲染列名的HTML样式,只需要把escape = FALSE改为escape = 'header'即可实现列名转义、表体按规则处理的效果。
内容的提问来源于stack exchange,提问作者JLemvig
相关产品推荐
相关产品推荐

