过滤/ grep函数表现奇怪

clb*_*clb 4 regex r

使用以下代码从字符串列表中仅选择字母数字字符串:

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"输出?

Pie*_*une 5

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:)