Ответ
Вздох, мне понадобилось 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, который сам по себе является аббревиатурой « G lobal R egular E xpression P rint», он будет читать строки ввода и затем печатать их, если они соответствуют аргументам, которые вы дали. «Глобальный» означал, что совпадение может произойти в любом месте строки ввода, я объясню «Регулярное выражение» ниже, но идея в том, что это более разумный способ сопоставления строки (например, R вызывает этот «символ» class("abc")
) и «Печать». msgstr "потому что это программа командной строки, испускание вывода означает, что он печатает в свою строку вывода
Теперь grep
программа представляет собой фильтр, от строк ввода до строк вывода. И похоже, что grep
функция R аналогично будет принимать массив входов. По причинам, которые мне совершенно неизвестны (я начал играть с R около часа назад), он возвращает вектор совпадающих индексов, а не список совпадений.
Но, возвращаясь к вашему первоначальному вопросу, мы действительно хотим узнать, нашли ли мы иголку в стоге сена, истинное / ложное значение. Они , видимо , решили назвать эту функцию grepl
, как и в «Grep» , но с « L ogical» возвращаемого значения (они называют истинные и ложные логические значения, например class(TRUE)
).
Итак, теперь мы знаем, откуда пришло название и что оно должно делать. Вернемся к регулярным выражениям. Аргументы, даже если они являются строками, они используются для построения регулярных выражений (далее: regex). Регулярное выражение - это способ сопоставления строки (если это определение вас раздражает, отпустите его). Например, регулярное выражение a
соответствует символу "a"
, регулярное выражение a*
соответствует символу "a"
0 или более раз, а регулярное выражение a+
соответствует символу "a"
1 или более раз. Следовательно, в приведенном выше примере стрелка, которую мы ищем 1+2
, когда рассматривается как регулярное выражение, означает «один или более 1, а затем 2» ... но за нашей следует плюс!
Таким образом, если вы используете grepl
без установки fixed
, ваши иглы будут случайно стогами сена, и это будет работать случайно довольно часто, мы можем видеть, что это работает даже на примере ОП. Но это скрытая ошибка! Нам нужно сказать, что входные данные - это строка, а не регулярное выражение, что, по-видимому, fixed
и для этого. Почему исправлено? Понятия не имею, добавьте этот ответ в закладки, потому что вам, вероятно, придется искать его еще 5 раз, прежде чем вы его запомните.
Несколько заключительных мыслей
Чем лучше ваш код, тем меньше истории вы должны знать, чтобы понять его. Каждый аргумент может иметь по крайней мере два интересных значения (в противном случае он не должен быть аргументом), в документе приведен список из 9 аргументов, что означает, что есть как минимум 2 ^ 9 = 512 способов вызвать его, это много работы для писать, тестировать и запоминать ... разъединять такие функции (разбивать их, удалять зависимости друг от друга, строковые объекты отличаются от регулярных выражений, а не от векторных). Некоторые из этих опций также являются взаимоисключающими, не дают пользователям неправильных способов использования кода, то есть проблемный вызов должен быть структурно бессмысленным (например, передавать несуществующую опцию), а не логически бессмысленным (где вы должны выдать предупреждение, чтобы объяснить это). Положите в переносном смысле: заменить входную дверь на 10-м этаже стеной лучше, чем вывесить табличку, предупреждающую о ее использовании, но лучше либо нет, либо нет. В интерфейсе функция определяет, как должны выглядеть аргументы, а не вызывающая сторона (поскольку вызывающая сторона зависит от функции, вывод всего того, с чем каждый может захотеть вызвать ее, делает функцию зависимой и от вызывающих, и от этого типа циклическая зависимость быстро забьет систему и никогда не даст ожидаемых результатов). Будьте очень осторожны с двусмысленными типами, это недостаток дизайна, который Вывод всего, что каждый может захотеть вызвать, делает функцию зависимой и от вызывающих, и этот тип циклической зависимости быстро забьет систему и никогда не даст ожидаемых результатов). Будьте очень осторожны с двусмысленными типами, это недостаток дизайна, который Вывод всего, что каждый может захотеть вызвать, делает функцию зависимой и от вызывающих, и этот тип циклической зависимости быстро забьет систему и никогда не даст ожидаемых результатов). Будьте очень осторожны с двусмысленными типами, это недостаток дизайна, которыйTRUE
и 0
и "abc"
все векторы.
fixed=TRUE
, иначе вы воспринимаете его как регулярное выражение вместо строки. Смотрите мой ответ с октября 2016 года.