DT::datatable正则表达式OR运算符第一种场景有效第二种无效问题排查
DT正则搜索仅匹配部分结果的原因
现象差异
- 针对
mtcars的代码:使用正则mazda|datsun,能正常返回所有匹配行。 - 针对
diamonds的代码:使用正则ideal|good,仅返回匹配ideal的行。
核心原因
两个示例的目标数据类型存在本质差异:
mtcars的行名是字符串类型
mazda和datsun是mtcars的行名,DT自动将其转换为row.names字符串列。全局搜索直接对字符串文本执行正则匹配,mazda|datsun可以精准匹配到包含对应文本的行,逻辑完全生效。diamonds的cut列是有序因子类型
diamonds$cut是有序因子,其底层存储的是整数编码(对应因子水平的顺序:Fair=1、Good=2、Very Good=3、Premium=4、Ideal=5),而前端显示的是因子的标签文本。- 在旧版本的DT中,全局搜索会直接针对因子的底层编码值而非显示文本进行匹配,文本形式的正则
ideal|good无法匹配到Good对应的编码2; - 而
ideal能匹配到对应行,是因为前端渲染时的文本与搜索字符串的大小写不敏感匹配出现了异常兼容(实际编码5与文本ideal无关联),属于旧版本的bug。
- 在旧版本的DT中,全局搜索会直接针对因子的底层编码值而非显示文本进行匹配,文本形式的正则
验证修复方案
若将cut列转换为字符串类型,正则搜索即可正常匹配ideal和good:datatable( ggplot2::diamonds |> head() |> dplyr::mutate(cut = as.character(cut)), filter = list(position = 'none', clear = TRUE), options = list( search = list(regex = TRUE, caseInsensitive = TRUE, search = 'ideal|good'), pageLength = 5 ) )
内容的提问来源于stack exchange,提问作者Rasmus Larsen
相关产品推荐
相关产品推荐

