使用以下代码从字符串列表中仅选择字母数字字符串:
isValid = function(string){ return(grep("^[A-z0-9]+$",string)) } strings = c("aaa","test@test.com","","valid") print(Filter(isValid,strings))
输出为[1]“aaa”“test@test.com”.
解决方法
Filter函数接受一个逻辑向量,您提供了一个数字.使用grepl:
isValid = function(string){ return(grepl("^[A-z0-9]+$",strings)) [1] "aaa" "valid"
grep为什么不工作?这是由于R将数值强制化为逻辑和过滤器的怪异.
这就是发生的事情,grep(“^ [A-z0-9] $”,string)正确返回1 4.这是第一个和第四个元素的匹配索引.
但这不是过滤器的工作原理.它使用as.logical(unlist(lapply(x,f)))在每个元素上运行条件.
所以它运行isValid(strings [1])然后运行isValid(strings [2])等等.它创造了这个:
[[1]] [1] 1 [[2]] integer(0) [[3]] integer(0) [[4]] [1] 1
然后它在该列表上调用unlist以获得1 1并将其转换为逻辑向量TRUE TRUE.所以最后你得到了:
strings[which(c(TRUE,TRUE))]
变成了
strings[c(1,2)] [1] "aaa" "test@test.com"
故事的道德,不要使用过滤器:)