【问题标题】:DT cell hover showing cell based sample sizes from hidden columnDT 单元格悬停显示隐藏列中基于单元格的样本大小
【发布时间】:2019-11-30 23:30:21
【问题描述】:

我之前询问过如何根据隐藏列中存储的颜色为单元格着色 (link)。我看到也可以通过thisthis 帖子为(DT)表应用悬停信息。

我想扩展我的初始帖子,我想在其中添加悬停选项以显示与单个单元格相关的样本大小。这些样本大小未显示在表格中(即隐藏),但仅在悬停时显示。我真的在推动我的 Java 知识来完成这项工作。

从我最初的帖子开始,输入数据框可能如下所示:

dat <- iris[1:5,1:5]
colours2apply <- sample(x=c(rgb(1, 0, 0 ), rgb(1, 1, 0 ), rgb(0, 1, 1 )), 25, replace = T) %>% 
  matrix(nrow=5) %>% 
  data.frame()
set.seed(1234)
SampleSizesToShowInHover <- matrix(round(runif(n = 25, 10, 1000)), nrow=5)

  dat <- cbind(dat, colours2apply)
  dat <- cbind(dat, SampleSizesToShowInHover)
dat

根据我之前帖子中的答案,此代码添加了基于单元格的着色:

DT <- datatable(dat, 
                options = list(columnDefs = list(list(visible=FALSE, targets = 6:10))))
for(i in 1:5){
  DT <- DT %>%
    formatStyle(i, valueColumns = i+5, backgroundColor = JS("value"))
}
DT

除了着色之外,如何添加基于单元格的悬停信息?

【问题讨论】:

    标签: r shiny hover dt


    【解决方案1】:

    您可以简单地向选项参数添加一个行回调,以从隐藏列中获取工具提示。像这样的:

    DT <- datatable(dat, 
                    options = list(columnDefs = list(list(visible=FALSE, targets = 6:10)), rowCallback = JS(
                      "function(nRow, aData, iDisplayIndex, iDisplayIndexFull) {",
                      "$('td:eq(1)', nRow).attr('title',aData[1+5]);",
                      "$('td:eq(2)', nRow).attr('title',aData[2+5]);",
                      "$('td:eq(3)', nRow).attr('title',aData[3+5]);",
                      "$('td:eq(4)', nRow).attr('title',aData[4+5]);",
                      "$('td:eq(5)', nRow).attr('title',aData[6+5]);",
                      "}")))
    

    [编辑]:

    您可以在循环中执行相同的操作,如下所示:

    DT <- datatable(dat, 
                    options = list(columnDefs = list(list(visible=FALSE, targets = 6:10)), rowCallback = JS(
                      "function(nRow, aData, iDisplayIndex, iDisplayIndexFull) {",
                      'for(i=0; i<5; i++ ){',
                      "$('td:eq('+i+')', nRow).attr('title',aData[i+5]);",
                      '}',
                      "}")))
    

    【讨论】:

    • 感谢您抽出宝贵时间查看我的问题并撰写答案。您的答案中的代码有效,但是我将如何将其集成到循环中(即类似于如何通过 formatStyle 将背景颜色添加到 DT)?我有很多列并且数据是反应性的,所以像这样的硬编码并不理想。
    • @Luc 我已经编辑了我的答案,以便它使用循环工作。希望对您有所帮助!
    • @Luc 我想我理解这个问题。 formatStyle 也使用 rowCallback。然后,如果您还有自己的rowCallback,则DT 连接rowCallback 函数的两个主体。但是formatStylerowCallback 有参数function(row, data)。所以你需要用row替换nRow,用data替换aData
    • @Luc 正如@Stéphane Laurent 指出的formatStyle 也使用rowCallback。因此,要解决这个问题,您可以使用 "$('td:eq('+i+')', nRow).attr('title',aData[i+5]).css('background-color', aData[i+5]);" 添加颜色,而不是只在循环中执行 "$('td:eq('+i+')', nRow).attr('title',aData[i+5]);" 并完全消除 formatStyle
    • @Luc,您所要求的一切都可以使用 JS 来完成,但这个答案超出了这个问题的范围。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 2019-02-01
    • 2011-03-18
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2015-11-03
    相关资源
    最近更新 更多