【问题标题】:filter shiny DT using regex containing not string使用不包含字符串的正则表达式过滤闪亮的 DT
【发布时间】:2026-02-16 17:40:01
【问题描述】:

我有一个简短的问题,关于在shiny 中实现的包DT。我想在闪亮的应用程序中使用可渲染的*过滤器来过滤掉包含特定单词的行。我已经在optionsregexp=TRUE 设置了,但我仍然无法使其工作

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

^((?!intronic).)*$

我已经尝试逃避这部分((?!intronic).),但它也不起作用

编辑

这是我渲染表格的完整代码

      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 的一个例子,真正的有超过 50,000 行和 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")

【问题讨论】:

  • 这里没有足够的代码或示例数据来查看您的代码中是否有任何错误或是否有其他问题。所以我们能做的最好的就是用很少的证据进行猜测。如果您提出的问题包括示例输入数据、您尝试过的代码和预期的输出,您会得到更好的回答。
  • 您可以运行str(df) 来查看您的df 有什么吗?
  • 或者最好是dput(df),..
  • @BigDataScientist,我添加了dput(df)

标签: r shiny dt


【解决方案1】:

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

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

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

【讨论】:

  • 感谢@Stephane,但我已将搜索包含在选项中,但在我的数据表中仍然无法使用(请参阅我的帖子的编辑)
  • @user2380782 您的代码不可重现。我帮不上忙。
  • 我已经使用我的数据子集运行了您的代码,并且过滤器确实有效,但是当我运行整个应用程序时它不起作用。有没有可能我可以将我的代码离线发送给你,我的代码有点长,在这里包含。
【解决方案2】:

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

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

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

希望对你有帮助。

【讨论】:

  • 感谢@Sam Old,但我想在闪亮的应用程序中使用*过滤器进行过滤,而不是在 data.frame 之前
最近更新 更多