如何解决R:根据条件在DT :: datatable中隐藏单元格
我正在尝试创建带有子行的数据表:用户将能够单击名称,并查看与该名称相关的链接列表。但是,每个名称显示的itens数量是不同的。
> data1 <- data.frame(name = c("John","Maria","Afonso"),a = c("abc","def","rty"),b=c("ghj","lop",NA),c=c("zxc","cvb",d=c(NA,"mko",NA))
> data1
name a b c d
1 John abc ghj zxc <NA>
2 Maria def lop cvb mko
3 Afonso rty <NA> <NA> <NA>
我正在使用varsExplore :: datatable2隐藏特定列:
varsExplore::datatable2(x=data1,vars=c("a","b","c","d"))
并产生以下结果
是否可以修改DT :: datatable以便仅渲染非“ null”的单元格?因此,例如,如果有人单击“ Afonso”,则该表将仅呈现“ rty”,从而为其他列(对于此行)隐藏“空”值,而如果用户单击“玛丽亚”,则仍显示这些列(没有任何“ null”)。
(我是否应该尝试其他方法以实现此行为?)
解决方法
深入了解varsExplore::datatable2
按照您的要求,我研究了varsExplore::datatable2
源代码。而且我发现varsExplore::datatable2
调用varsExplore:::.callback2
(3 :
表示它不是导出函数)来创建javascript代码。此函数还调用varsExplore:::.child_row_table2
,该函数返回一个JavaScript函数format(row_data)
,该函数将行数据格式化为您看到的表。
建议的解决方案
我只是用我的js
知识来更改varsExplore:::.child_row_table2
的输出,然后想到了以下内容:
.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(
" ( d[{pos[i]}]!==null ? ( '<tr>' +
'<td>' + '{names_x[pos[i]]}' + '</td>' +
'<td>' + d[{pos[i]}] + '</td>' +
'</tr>' ) : '' ) + " ))
}
paste0(text,"'</table></div>'
return text;};"
)
}
我所做的唯一更改是添加了d[{pos[i]}]!==null ? ....... : ''
,当其值pos[i]
不为空时,该列仅显示列d[pos[i]]
。
考虑到加载程序包并将功能添加到全局环境并不能解决问题,我在github上对其进行了分叉,并提交了您现在可以通过运行安装的更改(github repo是read-只有cran镜像无法提交拉取请求)
devtools::install_github("moutikabdessabour/varsExplore")
编辑
如果您不想重新下载软件包,我基本上找到了一个解决方案,您将需要覆盖datatable2
函数:
- 首先将源代码复制到位于
path/to/your/Rfile
的R文件中
# the data.table way
data.table::fwrite(list(capture.output(varsExplore::datatable2)),quote=F,sep='\n',file="path/to/your/Rfile",append=T)
# the baseR way
fileConn<-file("path/to/your/Rfile",open='a')
writeLines(capture.output(varsExplore::datatable2),fileConn)
close(fileConn)
- 然后您将不得不替换最后一个ligne
DT::datatable(
x,...,escape = -2,options = opts,callback = DT::JS(.callback2(x = x,pos = c(0,pos)))
)
与:
DT::datatable(
x,callback = DT::JS(gsub("('<tr>.+?(d\\[\\d+\\]).+?</tr>')","(\\2==null ? '' : \\1)",varsExplore:::.callback2(x = x,pos))))
)
这段代码基本上是在使用正则表达式添加js条件。
结果
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。