【发布时间】:2016-07-09 05:40:46
【问题描述】:
R 函数 grep 和 !grep (NOT grep) 在逻辑上不一致;不像 grepl 和 !grepl (NOT grepl),它们在逻辑上是一致的。
grepl 返回一个长度等于正在搜索的项目数的逻辑向量。例如,如果在 5 项向量的第 2 项和第 3 项中找到目标,则返回以下内容:
FALSE TRUE TRUE FALSE FALSE
如果grepl被!grepl替换,则返回“相反”的逻辑结果:
TRUE FALSE FALSE TRUE TRUE
grep,另一方面返回找到的项目的 2 个位置的向量:2 3
!grep 在同一场景中返回什么?逻辑上它应该返回1 4 5,而不是返回FALSE FALSE。这怎么可能是一个逻辑一致的返回值?谁能解释一下?
【问题讨论】:
-
由于
grep返回integers 的0+ 向量,因此未在它们上定义!(反转逻辑)运算符。你能确定地告诉我invert_logic 5:7是什么意思吗? (如果你知道向量的长度,那么你就可以推断出1:4,8:n,但这是冒昧的。)由于grepl返回了logicals 的0+ 向量,所以说invert_logic c(T,T,F,T)是有意义的,因为你正在索引具有相同长度的逻辑向量(反转或其他)的向量,你很好。 (顺便说一句:letters[ -grep("[f-h]", letters ]正在有效地反转。) -
试试
grep(..., invert = TRUE)。我想这就是你想要的。 -
1)
grep返回匹配模式的索引,而grepl返回一个逻辑向量; 2)!运算符将其参数强制为logical。例如尝试!c(0,2,4),你会发现它等同于!as.logical(c(0,2,4)); 3) 检查grep的invert参数。 -
@r2evans “
!(反转逻辑)运算符未在整数上定义”不正确。您可以在integer和numeric向量上使用!。 -
@r2evans 我明白了。 OP 应该意识到
!grep不是 一个函数(正如它们似乎暗示的那样),而是两个函数,!运算符应用于grep产生的结果和不会改变grep的行为。