使用不包含字符串的正则表达式过滤闪亮的 DT

filter shiny DT using regex containing not string

我有一个关于 shiny 中实施的包 DT 的快速问题。我想在闪亮的应用程序中使用 renderdatable 中的顶级过滤器来过滤掉包含特定单词的行。我已经在 options regexp=TRUE 中设置了,但我仍然无法正常工作

我正在使用这个正则表达式

^((?!intronic).)*$

我试过转义这部分((?!intronic).)但它也不起作用

编辑

这是我渲染 table

的完整代码
      DT::datatable(df, 
    rownames = FALSE,
    selection = "none",
            style = 'bootstrap', 
            class = 'compact display',
            #class = 'compact cell-border stripe hover', 
            filter = list(position = 'top', clear = FALSE), 
            escape = FALSE,
            extensions = c('Buttons'),
             options = list(
              stateSave = FALSE,
              ordering = FALSE,
              autoWidth = TRUE,
              searchCols = default_search_columns,
              search = list(regex = TRUE, caseInsensitive = TRUE),
              columnDefs = list(
                list(
                className = 'dt-center',
                targets = cols_to_all,
                render = JS("function(data, type, row, meta) {",
                            "return type === 'display' && typeof data === 'string' && data.length > 14 ?",
                            "'<span title=\"' + data + '\">' + data.substr(0, 14) + '...</span>' : data;",
                            "}") 
                ),
                list(
                  visible = FALSE,
                targets = cols_to_hide                   
                )),
              initComplete = JS(
                  "function(settings, json) {",
                  "$(this.api().table().header()).css({'font-size': '12px'});",
                  "}"),
              #dom = 'Bfrtip',
              sDom = '<"top">Blrt<"bottom">ip', # remove search general box and keep the top filters
              #dom  = 'BT<"clear">frti',
              #dom = 'Bftir',
              scroller = TRUE,
              scrollX = TRUE,
              #scrollY = "800px",
              deferRender=TRUE,
              buttons = list('colvis'),                  
              #FixedHeader = TRUE,
              pageLength = 25,
              lengthMenu = list(c(25, 50, 100, -1), list('25', '50', '100', 'All'))#,
            )

我已将 search 选项包含在列表中

EDIT2

这是我的daframe的例子,真实的有5万多行160列。但是,我有兴趣将过滤器应用于名为 Func.refGene

的列
 >dput(df)
 structure(list(Chr = c("chr1", "chr1", "chr1", "chr1", "chr1", 
 "chr1", "chr1", "chr1", "chr1", "chr1", "chr1", "chr1", "chr1", 
 "chr1", "chr1"), Start = c(69511L, 876499L, 877831L, 878314L, 
 879676L, 879676L, 879687L, 879687L, 881627L, 887560L, 887801L,  
 888639L, 888659L, 889158L, 889159L), End = c(69511L, 876499L, 
 877831L, 878314L, 879676L, 879676L, 879687L, 879687L, 881627L, 
 887560L, 887801L, 888639L, 888659L, 889158L, 889159L), GATK.RefCount   = c("0", 
"0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", 
"0"), GATK.AltCount = c("55", "60", "138", "184", "111", "111", 
"110", "110", "103", "66", "138", "73", "50", "96", "96"), GATK.Filter = c("MQ_LT_40", 
"PASS", "PASS", "PASS", "PASS", "PASS", "PASS", "PASS", "PASS", 
"PASS", "PASS", "PASS", "PASS", "PASS", "PASS"), Func.refGene =   c("exonic", 
"intronic", "exonic", "exonic", "UTR3", "UTR3", "UTR3", "UTR3", 
 "exonic", "intronic", "exonic", "exonic", "exonic",   "splicing;intronic", 
 "splicing;intronic"), Gene.refGene = c("OR4F5", "SAMD11", "SAMD11", 
 "SAMD11", "NOC2L", "SAMD11", "NOC2L", "SAMD11", "NOC2L", "NOC2L", 
 "NOC2L", "NOC2L", "NOC2L", "NOC2L", "NOC2L"), GeneDetail.refGene = c(".", 
 ".", ".", ".", "NM_015658:c.*398C>T;NM_152486:c.*143G>A",    "NM_015658:c.*398C>T;NM_152486:c.*143G>A", 
"NM_015658:c.*387A>G;NM_152486:c.*154T>C",     "NM_015658:c.*387A>G;NM_152486:c.*154T>C", 
 ".", ".", ".", ".", ".", "NM_015658:exon8:c.888+4C>G",     "NM_015658:exon8:c.888+3T>G"
 )), row.names = c(NA, 15L), class = "data.frame")

您必须像这样设置 regex 选项:

library(DT)
datatable(iris, 
          options = list(search = list(regex = TRUE)))

然后您可以检查 ^((?!(setosa)).)*$ 是否正常工作。

我在小鼠基因中做了类似的事情来移除 "Rik" 预测基因。这是我的解决方案。

rik = grep("Rik$", rownames(DF))

datatable(DF[-rik,]) %>%
  ... %>%
  formatSignif(columns = c('log2.FC', 'adj.P.val'), digits = 3)

希望对您有所帮助。