R语言自定义函数中grepl默认匹配全部字符串的实现问题
解决方法:修正正则表达式默认值
嘿,这个思路挺巧妙的!不过你写的默认参数"*.*"其实是个无效的正则表达式——因为*是重复量词,必须跟在某个具体的字符、组或者字符类后面,直接开头会让grepl报错。咱们调整一下默认值就能完美实现需求啦:
修正后的函数
library(dplyr) some_sub <- function(data, descr = ".*"){ data %>% filter(grepl(descr, description)) }
为什么这样可行?
正则表达式".*"的含义是:
.匹配任意单个字符(除了换行符)*表示前面的元素可以出现0次或多次
组合起来就能匹配任意长度的任意字符(包括空字符串),所以当你不传descr参数时,grepl会对每一行返回TRUE,filter就会保留所有行。
测试验证
先加载你的数据集:
data <- structure(list(description = structure(c(1L, 1L, 2L, 1L), .Label = c("Cabbage","Carrot"), class = "factor"), weight = c(12L, 9L, 7L, 15L)), class = "data.frame", row.names = c(NA,-4L))
- 调用
some_sub(data)(无筛选参数),返回全部数据:
description weight 1 Cabbage 12 2 Cabbage 9 3 Carrot 7 4 Cabbage 15
- 调用
some_sub(data, "Cabbage"),筛选出含"Cabbage"的行:
description weight 1 Cabbage 12 2 Cabbage 9 4 Cabbage 15
额外小提示
如果你的数据集里description字段可能存在NA值,默认的grepl会返回NA,导致filter自动剔除这些行。如果想保留含NA的行,可以修改filter条件:
some_sub <- function(data, descr = ".*"){ data %>% filter(grepl(descr, description) | is.na(description)) }
内容的提问来源于stack exchange,提问作者pluke
相关产品推荐
相关产品推荐

