正如 alexwhan 所说,grep 是要使用的函数。但是,小心将它与列表一起使用。它没有做你可能认为它正在做的事情。例如:
grep("c", z)
[1] 1 2 3 # ?
grep(",", z)
[1] 1 2 3 # ???
幕后发生的事情是grep 使用as.character 将其第二个参数强制转换为字符。当应用于列表时,as.character 返回的是该列表的字符表示通过对其进行解析获得。 (以非列表为模。)
as.character(z)
[1] "c(\"a\", \"b\", \"c\")" "c(\"b\", \"d\", \"e\")" "c(\"a\", \"e\", \"f\")"
cat(as.character(z))
c("a", "b", "c") c("b", "d", "e") c("a", "e", "f")
这就是grep 的工作。
如果你想在一个列表上运行grep,一个更安全的方法是使用lapply。这会返回另一个列表,您可以对其进行操作以提取您感兴趣的内容。
res <- lapply(z, function(ch) grep("a", ch))
res
[[1]]
[1] 1
[[2]]
integer(0)
[[3]]
[1] 1
# which vectors contain a search term
sapply(res, function(x) length(x) > 0)
[1] TRUE FALSE TRUE