Responda
Suspiro, levei 45 minutos para encontrar a resposta para esta pergunta simples. A resposta é: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
Interpretação
grep
é nomeado após o executável do Linux, o que em si é um acrônimo de " G lobal R egular E xpression P rint", ele iria ler linhas de entrada e, em seguida, imprimi-los se eles combinavam com os argumentos que você deu. "Global" significou que a correspondência poderia ocorrer em qualquer lugar da linha de entrada, explicarei abaixo "Expressão regular" abaixo, mas a ideia é que é uma maneira mais inteligente de corresponder à string (R chama esse "caractere", por exemplo class("abc")
) e "Print "porque é um programa de linha de comando, emitir saída significa que imprime na sua cadeia de saída.
Agora, o grep
programa é basicamente um filtro, das linhas de entrada às linhas de saída. E parece que a grep
função de R, da mesma forma, terá uma matriz de entradas. Por razões totalmente desconhecidas para mim (eu só comecei a jogar com o R há cerca de uma hora), ele retorna um vetor dos índices correspondentes, em vez de uma lista de correspondências.
Mas, voltando à sua pergunta original, o que realmente queremos é saber se encontramos a agulha no palheiro, um valor verdadeiro / falso. Eles aparentemente decidiu nomear esta função grepl
, como em "grep", mas com um " L valor de retorno ogical" (que eles chamam de valores lógicos verdadeiro e falso, por exemplo class(TRUE)
).
Então, agora sabemos de onde o nome veio e o que ele deve fazer. Vamos voltar para expressões regulares. Os argumentos, mesmo que sejam cadeias, são usados para criar expressões regulares (doravante: regex). Um regex é uma maneira de corresponder a uma string (se essa definição o irritar, deixe-o ir). Por exemplo, a regex a
corresponde ao caractere "a"
, a regex a*
corresponde ao caractere "a"
0 ou mais vezes e a regex a+
corresponde ao caractere "a"
1 ou mais vezes. Portanto, no exemplo acima, a agulha que estamos procurando 1+2
, quando tratada como regex, significa "um ou mais 1 seguido de um 2" ... mas o nosso é seguido de um sinal de mais!
Portanto, se você usasse a grepl
configuração sem fixed
, suas agulhas seriam acidentalmente palheiros e isso acidentalmente funcionaria com bastante frequência, podemos ver que funciona até para o exemplo do OP. Mas isso é um bug latente! Precisamos dizer que a entrada é uma string, não uma regex, que aparentemente fixed
é para isso. Por que consertado? Nenhuma pista, marque esta resposta com um b / c. Você provavelmente terá que procurar mais 5 vezes antes de memorizá-la.
Algumas considerações finais
Quanto melhor o seu código, menos histórico você precisa conhecer para entender o código. Todo argumento pode ter pelo menos dois valores interessantes (caso contrário, não precisaria ser um argumento), os documentos listam 9 argumentos aqui, o que significa que há pelo menos 2 ^ 9 = 512 maneiras de invocá-lo, é muito trabalho para escreva, teste e lembre-se ... dissocie essas funções (divida-as, remova dependências umas das outras, as coisas de string são diferentes do que as expressões regulares, as coisas do vetor). Algumas das opções também são mutuamente exclusivas, não fornecem aos usuários maneiras incorretas de usar o código, ou seja, a chamada problemática deve ser estruturalmente sem sentido (como passar uma opção que não existe), não logicamente sem sentido (onde você precisa emitir um aviso para explicá-lo). Coloque metaforicamente: substituir a porta da frente no lado do 10º andar por uma parede é melhor do que pendurar uma placa que adverte contra seu uso, mas também é melhor que nenhuma. Em uma interface, a função define como devem ser os argumentos, e não o chamador (porque o chamador depende da função, inferindo tudo o que todos desejam chamar) faz com que a função dependa também dos chamadores e desse tipo de dependência cíclica entupirá rapidamente um sistema e nunca fornecerá os benefícios que você espera). Desconfie de tipos equivocados, é uma falha de design que coisas como inferir tudo o que todos podem querer chamar também faz com que a função dependa dos chamadores, e esse tipo de dependência cíclica entupirá rapidamente um sistema e nunca fornecerá os benefícios que você espera). Desconfie de tipos equivocados, é uma falha de design que coisas como inferir tudo o que todos podem querer chamar também faz com que a função dependa dos chamadores, e esse tipo de dependência cíclica entupirá rapidamente um sistema e nunca fornecerá os benefícios que você espera). Desconfie de tipos equivocados, é uma falha de design que coisas comoTRUE
e 0
e "abc"
são todos vetores.
fixed=TRUE
, caso contrário, você a está tratando como uma expressão regular em vez de uma string. Veja minha resposta de outubro de 2016.