如何根据R Shiny DT中的模式突出显示每行包含单个字符的行中的一堆相邻单元格

时间:2017-03-20 07:21:30

标签: javascript r shiny dt

此查询是此论坛中我之前query的扩展程序。但是,这次我必须处理一行中的一系列字符,每个字符都在一个单元格中,如下图所示。我想基于如下模式突出显示或更改某些单元格的背景:

  1. 任何包含A?C字母的相邻单元格,其中?可以是任意字母或

  2. 单元格中的M

  3. 相邻单元格中的N和F,如NF,如下图所示。

  4. 换句话说,需要将此表格转换为 Series of letters in adjacent column cells

    使用R Shiny DT中的rowCallback函数。 enter image description here

1 个答案:

答案 0 :(得分:3)

我在这里拉我的包,所以这可能不适合你,因为它只使用HTML表而不是DT,并且在R方面工作而不是在javascript中。

find_pattern <- function (pat, mat) {
  # collapse the row into a single string:
  strings <- apply(mat, 1, paste0, collapse = '')
  # find the patterns you want:
  found   <- gregexpr(pat, strings, perl = TRUE)
  # the rest is just housekeeping:
  pos <- matrix(FALSE, nrow(mat), ncol(mat))
  lapply(seq_along(found), function (x) {
    matches <- found[[x]]
    lens <- attr(matches, 'match.length')
    if (all(matches == -1)) return()
    for (p in seq_along(matches)) {
      start <- matches[p]
      len <- lens[p]
      end <- start + len - 1
      pos[x, start:end] <<- TRUE 
    }
  })
  which(pos, arr.ind = TRUE)
}

library(huxtable)
mydata <- matrix(sample(c('A', 'B', 'C', 'M', 'N', 'F'), 750, replace=TRUE), 3, 250)
colnames(mydata) <- paste0('X', 1:250)
myhux <- as_hux(mydata, add_colnames = TRUE)
myhux <- set_all_borders(myhux, 1)
background_color(myhux)[1,] <- 'grey'
background_color(myhux)[myhux == 'M'] <- 'green'
background_color(myhux)[find_pattern('A.C', myhux)] <- 'yellow'
background_color(myhux)[find_pattern('NF', myhux)] <- 'blue'
myhux

结果是:

enter image description here

find_pattern函数将接受您抛出的任何perl正则表达式。 A.C表示A,后跟任何字母,后跟C。