Antwort
Seufz, ich habe 45 Minuten gebraucht, um die Antwort auf diese einfache Frage zu finden. Die Antwort ist: 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
Auslegung
grep
ist nach der ausführbaren Linux-Datei benannt, die selbst ein Akronym für " G lobal R egular E xpression P rint", würde es die Eingabezeilen lesen und dann ausgeben, wenn sie mit den angegebenen Argumenten übereinstimmen. "Global" bedeutete, dass die Übereinstimmung überall in der Eingabezeile vorkommen konnte. Ich werde "Regulärer Ausdruck" weiter unten erklären, aber die Idee ist, dass es ein intelligenterer Weg ist, die Zeichenkette abzugleichen (R nennt dies "Zeichen", z.B. class("abc")
) und "Print", weil es sich um ein Kommandozeilenprogramm handelt, das in seine Ausgabezeichenfolge druckt.
Nun, die grep
Programm ist im Grunde ein Filter, von Eingabe- zu Ausgabezeilen. Und es scheint, dass R's grep
Funktion nimmt ebenfalls ein Array von Eingaben entgegen. Aus Gründen, die mir völlig unbekannt sind (ich habe erst vor etwa einer Stunde angefangen, mit R zu spielen), gibt sie einen Vektor der übereinstimmenden Indizes zurück, statt einer Liste von Übereinstimmungen.
Aber zurück zu Ihrer ursprünglichen Frage: Was wir wirklich wissen wollen, ist, ob wir die Nadel im Heuhaufen gefunden haben, ein wahrer oder falscher Wert. Sie haben offenbar beschlossen, diese Funktion zu nennen grepl
wie bei "grep", aber mit einem " L ogischen" Rückgabewert (sie nennen true und false logische Werte, z.B. class(TRUE)
).
Jetzt wissen wir also, woher der Name stammt und was er bewirken soll. Kommen wir zurück zu den regulären Ausdrücken. Die Argumente, auch wenn sie Zeichenketten sind, werden verwendet, um reguläre Ausdrücke (im Folgenden: regex) zu bilden. Ein Regex ist eine Möglichkeit, eine Zeichenkette abzugleichen (wenn Sie diese Definition irritiert, lassen Sie es sein). Zum Beispiel kann der Regex a
entspricht dem Zeichen "a"
die Regex a*
entspricht dem Zeichen "a"
0 oder mehr Mal, und die Regex a+
würde mit dem Zeichen "a"
1 oder mehrere Male. Im obigen Beispiel suchen wir also nach der Nadel 1+2
bedeutet als Regex "eine oder mehrere 1 gefolgt von einer 2"... aber auf unsere folgt ein Plus!
Wenn Sie also die grepl
ohne Einstellung fixed
Ihre Nadeln wären versehentlich Heuhaufen, und das würde versehentlich ziemlich oft funktionieren, wie wir sehen können, funktioniert es sogar für das Beispiel des Auftraggebers. Aber das ist ein verborgener Fehler! Wir müssen dem Programm sagen, dass die Eingabe eine Zeichenkette und kein Regex ist, was anscheinend der Fall ist. fixed
ist für. Warum fixiert? Keine Ahnung, merken Sie sich diese Antwort, denn Sie werden sie wahrscheinlich noch 5 Mal nachschlagen müssen, bevor Sie sie auswendig können.
Ein paar abschließende Gedanken
Je besser Ihr Code ist, desto weniger Geschichte müssen Sie kennen, um ihn zu verstehen. Jedes Argument kann mindestens zwei interessante Werte haben (sonst bräuchte es kein Argument zu sein), die Dokumentation listet hier 9 Argumente auf, was bedeutet, dass es mindestens 2^9=512 Möglichkeiten gibt, es aufzurufen, das ist eine Menge Arbeit zu schreiben, zu testen und sich zu merken... entkoppeln Sie solche Funktionen (teilen Sie sie auf, entfernen Sie Abhängigkeiten voneinander, String-Dinge sind anders als Regex-Dinge sind anders als Vektor-Dinge). Einige der Optionen schließen sich auch gegenseitig aus, geben Sie den Benutzern keine falschen Möglichkeiten, den Code zu verwenden, d.h. der problematische Aufruf sollte strukturell unsinnig sein (z.B. Übergabe einer Option, die nicht existiert), nicht logisch unsinnig (wo man eine Warnung ausgeben muss, um es zu erklären). Um es metaphorisch auszudrücken: Es ist besser, die Eingangstür im 10. Stock durch eine Wand zu ersetzen, als ein Schild aufzuhängen, das vor ihrer Benutzung warnt, aber beides ist besser als nichts. In einer Schnittstelle definiert die Funktion, wie die Argumente aussehen sollen, nicht der Aufrufer (da der Aufrufer von der Funktion abhängt, macht die Ableitung von allem, was jeder jemals aufrufen möchte, die Funktion auch von den Aufrufern abhängig, und diese Art von zyklischer Abhängigkeit wird ein System schnell verstopfen und nie die erwarteten Vorteile bringen). Seien Sie sehr vorsichtig mit zweideutigen Typen, es ist ein Designfehler, dass Dinge wie TRUE
y 0
y "abc"
sind alle Vektoren.