使用以下代码从字符串列表中仅选择字母数字字符串:
isValid = function(string){
return(grep("^[A-z0-9]+$", string))
}
strings = c("aaa", "test@test.com", "", "valid")
print(Filter(isValid, strings))
Run Code Online (Sandbox Code Playgroud)
输出是[1] "aaa" "test@test.com".
为什么"valid"不输出,为什么"test@test.com"输出?
该Filter函数接受一个逻辑向量,您提供了一个数字.用途grepl:
isValid = function(string){
return(grepl("^[A-z0-9]+$", string))
}
strings = c("aaa", "test@test.com", "", "valid")
print(Filter(isValid, strings))
[1] "aaa" "valid"
Run Code Online (Sandbox Code Playgroud)
为什么不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
Run Code Online (Sandbox Code Playgroud)
然后它调用unlist该列表来获取1 1并将其转换为逻辑向量TRUE TRUE.所以最后你得到了:
strings[which(c(TRUE, TRUE))]
Run Code Online (Sandbox Code Playgroud)
变成了
strings[c(1,2)]
[1] "aaa" "test@test.com"
Run Code Online (Sandbox Code Playgroud)
故事的道德,不要使用Filter:)