Responder
Suspiro, me tomó 45 minutos encontrar la respuesta a esta simple pregunta. La respuesta es: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
Interpretación
grep
lleva el nombre del ejecutable de Linux, que en sí es un acrónimo de " G lobal R egular E Xpression P rint", se leería las líneas de entrada y luego imprimirlos si coincide con los argumentos que diste. "Global" significa que la coincidencia podría ocurrir en cualquier lugar de la línea de entrada, explicaré "Expresión regular" a continuación, pero la idea es que es una forma más inteligente de hacer coincidir la cadena (R llama a este "carácter", por ejemplo class("abc")
) e "Imprimir "debido a que es un programa de línea de comando, la emisión de salida significa que se imprime en su cadena de salida.
Ahora, el grep
programa es básicamente un filtro, desde líneas de entrada hasta líneas de salida. Y parece que la grep
función de R de manera similar tomará una serie de entradas. Por razones completamente desconocidas para mí (solo comencé a jugar con R hace aproximadamente una hora), devuelve un vector de los índices que coinciden, en lugar de una lista de coincidencias.
Pero, volviendo a su pregunta original, lo que realmente queremos es saber si encontramos la aguja en el pajar, un valor verdadero / falso. Al parecer, decidieron llamar a esta función grepl
, como en "grep" pero con una " L valor de retorno gico" (que ellos llaman valores lógicos verdadero y falso, por ejemplo class(TRUE)
).
Entonces, ahora sabemos de dónde viene el nombre y qué se supone que debe hacer. Volvamos a las expresiones regulares. Los argumentos, aunque son cadenas, se usan para construir expresiones regulares (en adelante: regex). Una expresión regular es una forma de hacer coincidir una cadena (si esta definición te irrita, déjalo ir). Por ejemplo, la expresión regular a
coincide con el carácter "a"
, la expresión regular a*
coincide con el carácter "a"
0 o más veces, y la expresión regular a+
coincidirá con el carácter "a"
1 o más veces. Por lo tanto, en el ejemplo anterior, la aguja que estamos buscando 1+2
, cuando se trata como una expresión regular, significa "uno o más 1 seguido de un 2" ... ¡pero al nuestro le sigue un signo más!
Entonces, si usó la grepl
configuración sin configuración fixed
, sus agujas accidentalmente serían pajares, y eso funcionaría accidentalmente con bastante frecuencia, podemos ver que incluso funciona para el ejemplo del OP. Pero eso es un error latente! Necesitamos decirle que la entrada es una cadena, no una expresión regular, que aparentemente fixed
es para lo que sirve. ¿Por qué arreglado? No tengo idea, marque esta respuesta b / c, probablemente tendrá que buscarla 5 veces más antes de memorizarla.
Algunas reflexiones finales
Cuanto mejor sea su código, menos historia tendrá que saber para darle sentido. Cada argumento puede tener al menos dos valores interesantes (de lo contrario, no necesitaría ser un argumento), los documentos enumeran 9 argumentos aquí, lo que significa que hay al menos 2 ^ 9 = 512 formas de invocarlo, eso es mucho trabajo para escribir, probar y recordar ... desacoplar tales funciones (dividirlas, eliminar dependencias entre sí, las cosas de cadena son diferentes a las cosas de expresiones regulares son diferentes a las cosas de vectores). Algunas de las opciones también son mutuamente excluyentes, no brindan a los usuarios formas incorrectas de usar el código, es decir, la invocación problemática debe ser estructuralmente sin sentido (como pasar una opción que no existe), no lógicamente sin sentido (donde debe emitir una advertencia para explicarlo). Poner metafóricamente: reemplazar la puerta de entrada en el costado del décimo piso con una pared es mejor que colgar un letrero que advierte contra su uso, pero cualquiera de los dos es mejor que ninguno. En una interfaz, la función define cómo deberían verse los argumentos, no la persona que llama (porque la persona que llama depende de la función, inferir todo con lo que todos quieran llamarla hace que la función también dependa de las personas que llaman, y este tipo de dependencia cíclica obstruirá rápidamente un sistema y nunca proporcionará los beneficios que espera). Tenga mucho cuidado con los tipos equívocos, es un defecto de diseño que cosas como inferir todo con lo que todos quieran llamarlo hace que la función también dependa de las personas que llaman, y este tipo de dependencia cíclica obstruirá rápidamente un sistema y nunca proporcionará los beneficios que espera). Tenga mucho cuidado con los tipos equívocos, es un defecto de diseño que cosas como inferir todo con lo que todos quieran llamarlo hace que la función también dependa de las personas que llaman, y este tipo de dependencia cíclica obstruirá rápidamente un sistema y nunca proporcionará los beneficios que espera). Tenga mucho cuidado con los tipos equívocos, es un defecto de diseño que cosas comoTRUE
y 0
y "abc"
son todos vectores.
fixed=TRUE
, de lo contrario, la trata como una expresión regular en lugar de una cadena. Vea mi respuesta de octubre de 2016.