的Filter
函数接受一个合乎逻辑的载体,你提供的一个数字。使用grepl
:
isValid = function(string){
return(grepl("^[A-z0-9]+$", string))
}
strings = c("aaa", "[email protected]", "", "valid")
print(Filter(isValid, strings))
[1] "aaa" "valid"
为什么没有grep
工作?这是由于R的数值强制逻辑和Filter
的奇怪。
这是发生了什么,grep("^[A-z0-9]+$", string)
正确返回1 4
。这是第一个和第四个元素匹配的索引。
但这不是如何Filter
的作品。它在每个元素上运行条件为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" "[email protected]"
这个故事告诉我们,不要用Filter
:)
所以逻辑是,如果有任何非字母数字代码然后不输出字符串? – thepule
不,重点在于你需要使用'[A-Za-z0-9]',但是我发现它仍然不起作用。 –
使用'strings [grepl(“^ [[:alnum:]] + $”,strings)]' –