回答
唉,我花了 45 分钟才找到这个简单问题的答案。答案是:grepl(needle, haystack, fixed=TRUE)
# Correct
> grepl("1+2", "1+2", fixed=TRUE)
[1] TRUE
> grepl("1+2", "123+456", fixed=TRUE)
[1] FALSE
# Incorrect
> grepl("1+2", "1+2")
[1] FALSE
> grepl("1+2", "123+456")
[1] TRUE
解读
grep 以 linux 可执行文件命名,它本身是 "Global Regular Expression 的首字母缩写Print",它会读取输入行,然后在它们与您提供的参数匹配时打印它们。 “全局”意味着匹配可以出现在输入行的任何位置,我将在下面解释“正则表达式”,但想法是它是匹配字符串的更聪明的方式(R 称之为“字符”,例如class("abc")),和“打印”,因为它是一个命令行程序,发出输出意味着它打印到它的输出字符串。
现在,grep 程序基本上是一个过滤器,从输入行到输出行。似乎 R 的 grep 函数同样会采用一组输入。由于我完全不知道的原因(我大约一个小时前才开始使用 R),它返回匹配索引的向量,而不是匹配列表。
但是,回到你最初的问题,我们真正想要的是知道我们是否在大海捞针中找到了针,一个真/假值。他们显然决定将这个函数命名为grepl,就像在“grep”中一样,但带有一个“Logical”返回值(他们调用真假逻辑值,例如class(TRUE))。
所以,现在我们知道了名称的来源和用途。让我们回到正则表达式。参数,即使它们是字符串,它们也用于构建正则表达式(以下简称:正则表达式)。正则表达式是一种匹配字符串的方法(如果这个定义激怒了你,那就放手吧)。例如,正则表达式a 匹配字符"a",正则表达式a* 匹配字符"a" 0 次或多次,正则表达式a+ 匹配字符"a" 1 次或多次。因此,在上面的示例中,我们正在搜索的针 1+2,当被视为正则表达式时,表示“一个或多个 1 后跟一个 2”......但我们的后面是一个加号!
所以,如果你使用grepl 而不设置fixed,你的针会意外地成为干草堆,并且会经常意外地工作,我们可以看到它甚至适用于 OP 的示例。但这是一个潜在的错误!我们需要告诉它输入是一个字符串,而不是一个正则表达式,这显然是 fixed 的用途。为什么固定?不知道,把这个答案加入书签,b/c 你可能需要再查 5 次才能记住它。
一些最后的想法
您的代码越好,您需要了解的历史就越少。每个参数至少可以有两个有趣的值(否则它不需要是一个参数),文档在这里列出了 9 个参数,这意味着至少有 2^9=512 种调用它的方法,这需要做很多工作编写,测试和记住...解耦这些函数(将它们拆分,消除彼此的依赖关系,字符串事物与正则表达式事物不同,与向量事物不同)。一些选项也是互斥的,不要给用户错误的代码使用方式,即有问题的调用应该是结构上无意义的(例如传递一个不存在的选项),而不是逻辑上无意义的(你必须发出警告来解释它)。打个比方:用一堵墙代替 10 楼一侧的前门比挂一个警告不要使用它的标志要好,但两者都比两者都好。在接口中,函数定义了参数应该是什么样子,而不是调用者(因为调用者依赖于函数,推断每个人可能想要调用它的所有内容都使得函数也依赖于调用者,并且这种类型周期性依赖会迅速阻塞系统,并且永远不会提供您期望的好处)。小心模棱两可的类型,TRUE 和 0 和 "abc" 之类的东西都是向量,这是一个设计缺陷。