Risposta
Sospiro, mi ci sono voluti 45 minuti per trovare la risposta a questa semplice domanda. La risposta è: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
Interpretazione
grep
prende il nome del file eseguibile Linux, che è essa stessa un acronimo di " G lobal R egular E Xpression P tampa", sarebbe leggere le linee di input e quindi stampare loro se abbinati gli argomenti hai dato. "Globale" significa che la corrispondenza potrebbe verificarsi in qualsiasi punto della riga di input, spiegherò di seguito "Espressione regolare", ma l'idea è che sia un modo più intelligente per abbinare la stringa (R chiama questo "carattere", ad esempio class("abc")
) e "Stampa "poiché è un programma da riga di comando, l'emissione dell'output significa che stampa sulla sua stringa di output.
Ora, il grep
programma è fondamentalmente un filtro, dalle linee di input alle linee di output. E sembra che la grep
funzione di R in modo simile prenderà una serie di input. Per motivi che mi sono del tutto sconosciuti (ho iniziato a giocare con R solo un'ora fa), restituisce un vettore degli indici corrispondenti, anziché un elenco di corrispondenze.
Ma, tornando alla tua domanda originale, quello che vogliamo veramente è sapere se abbiamo trovato l'ago nel pagliaio, un valore vero / falso. Apparentemente hanno deciso di nominare questa funzione grepl
, come in "grep" ma con un valore di ritorno " L ogical" (chiamano valori logici veri e falsi, ad es class(TRUE)
.).
Quindi, ora sappiamo da dove viene il nome e cosa dovrebbe fare. Torniamo alle espressioni regolari. Gli argomenti, anche se sono stringhe, sono usati per costruire espressioni regolari (d'ora in poi: regex). Una regex è un modo per abbinare una stringa (se questa definizione ti irrita, lasciala andare). Ad esempio, la regex a
corrisponde al personaggio "a"
, la regex a*
corrisponde al carattere "a"
0 o più volte e la regex a+
corrisponderebbe al carattere "a"
1 o più volte. Quindi nell'esempio sopra, l'ago che stiamo cercando 1+2
, quando trattato come regex, significa "uno o più 1 seguito da un 2" ... ma il nostro è seguito da un plus!
Quindi, se si usasse il grepl
senza impostazione fixed
, i tuoi aghi sarebbero casualmente dei pagliai e ciò avrebbe accidentalmente funzionato abbastanza spesso, possiamo vedere che funziona anche per l'esempio del PO. Ma questo è un bug latente! Dobbiamo dirgli che l'input è una stringa, non una regex, che a quanto pare fixed
è ciò che serve. Perché riparato Nessun indizio, aggiungi questa risposta ai segnalibri in b / c probabilmente dovrai cercarla altre 5 volte prima di memorizzarla.
Alcuni pensieri finali
Migliore è il codice, minore è la cronologia che devi sapere per dargli un senso. Ogni argomento può avere almeno due valori interessanti (altrimenti non dovrebbe essere un argomento), i documenti elencano 9 argomenti qui, il che significa che ci sono almeno 2 ^ 9 = 512 modi per invocarlo, c'è molto lavoro da fare scrivere, testare e ricordare ... disaccoppiare tali funzioni (dividerle, rimuovere le dipendenze le une dalle altre, le cose della stringa sono diverse dalle cose regex sono diverse dalle cose vettoriali). Alcune delle opzioni si escludono a vicenda, non offrono agli utenti modi errati di utilizzare il codice, vale a dire che l'invocazione problematica dovrebbe essere strutturalmente priva di senso (come passare un'opzione che non esiste), non logicamente priva di senso (dove devi emettere un avvertimento per spiegarlo). Metti metaforicamente: sostituire la porta d'ingresso sul lato del decimo piano con un muro è meglio che appendere un cartello che mette in guardia contro il suo uso, ma uno dei due è meglio di nessuno dei due. In un'interfaccia, la funzione definisce come dovrebbero apparire gli argomenti, non il chiamante (perché il chiamante dipende dalla funzione, deducendo tutto ciò che chiunque potrebbe desiderare di chiamarlo fa dipendere anche la funzione dai chiamanti, e questo tipo di dipendenza ciclica ostruirà rapidamente un sistema e non fornirà mai i benefici che ci si aspetta). Diffidare di tipi equivoci, è un difetto di progettazione che piace alle cose dedurre tutto ciò che tutti potrebbero desiderare di chiamarlo fa sì che la funzione dipenda anche dai chiamanti e questo tipo di dipendenza ciclica ostruirà rapidamente un sistema e non fornirà mai i benefici che ci si aspetta). Diffidare di tipi equivoci, è un difetto di progettazione che piace alle cose dedurre tutto ciò che tutti potrebbero desiderare di chiamarlo fa sì che la funzione dipenda anche dai chiamanti e questo tipo di dipendenza ciclica ostruirà rapidamente un sistema e non fornirà mai i benefici che ci si aspetta). Diffidare di tipi equivoci, è un difetto di progettazione che piace alle coseTRUE
e 0
e "abc"
sono tutti vettori.
fixed=TRUE
, altrimenti la stai trattando come una regex invece che una stringa. Vedi la mia risposta da ottobre 2016.