2009-08-23 13 views
22

Llámame flojo, pero odio escribir cosas como paste("a","b",sep='') todo el tiempo.¿Por qué no funciona "+" en los caracteres en R?

sé que "(t) es la R. No hay ningún caso, sólo la forma." (library(fortunes);(fortune(109)). Entonces, mi pregunta de seguimiento es: ¿es posible cambiar fácilmente este comportamiento?

+0

El problema es cómo definir '+' en los caracteres. Desea sep = "" pero otros prefieren el valor predeterminado sep = "". Y qué pasa si uno de los dos elementos no es un carácter (numérico, lógico). ¿Cómo debería '+' ser definido? – Thierry

+0

"+" sería un operador binario, por lo que el argumento 'sep' no es relevante. Habría elecciones que hacer ("personaje" + numérico, etc.) pero yo (y sospecho que la mayoría de la gente) estaría bien con cualquier decisión, incluyendo solo permitir que los caracteres sean concatenados. Eso es lo que hace python, por ejemplo. La discusión enlazada por Martin a continuación es realmente interesante. –

Respuesta

23

@ Dirk: Por una vez, no está del todo bien. No es el analizador sintáctico Uno puede métodos de escritura en R para "+" - ayuda ("+") va a "operadores aritméticos" y menciona que éstos son genéricos y se puede escribir métodos para ellos ... y por supuesto muchos escritores de paquetes hacer, por ejemplo, lo hacemos para el paquete 'Matrix', y también lo hago para el paquete "Rmpfr", por ejemplo Pero Dirk también tiene razón (¡por supuesto!) Que no puede hacerlo en R actualmente, , simplemente definiendo un método para "+ .character".

Hace aproximadamente tres años, comencé un hilo en R-devel (la lista de correo R sobre el desarrollo de R, muy recomendable si te interesan estos temas, también puedes acceder a través de Gmane si no quieres para suscribirse): r-devel archived msg

se trataba de una discusión interesante con un buen número de ventajas y desventajas, sobre todo John Chambers ("el padre de S y por lo tanto R") bastante oponerse fuertemente utilizar "+" para una operación que es no conmutativa, y también r-devel archived msg2 (por otro miembro R-core), apoyando la opinión de que (R Core) no debe adoptar/apoyar la idea; y si la gente ** realmente * lo quería, podrían definir % +% para eso.

+1

Noté que Hadley escribió algunos métodos para "+" en su paquete ggplot2. Se usa para agregar varias capas en un diagrama. – Thierry

+0

Martin, gracias por la corrección detallada. –

+1

Excelente hilo que comenzó allí, gracias! Parece haber un conflicto entre aquellos que no creen que sea natural pensar en "+" como concatenación (por ejemplo, Chambers) y aquellos que lo ven todo el tiempo en otros idiomas y que están acostumbrados a él. ¿La discusión simplemente se detuvo allí? –

6

¿Está utilizando sprintf más conveniente para usted?

Aparte de eso, ¿qué hay de este pequeño juego de manos:

'%+%' <- paste 

'and' %+% 'now' %+% 'for'%+% 'something' %+% 'completely' %+% 'different'  
# [1] "and now for something completely different" 
+1

sprintf no es más conveniente en el caso predeterminado (sin formato) pero debería usarlo más a menudo. Gracias por la sugerencia de usar "% +%", aunque esto en realidad no responde a la pregunta principal. –

+2

No hay respuesta; no puede anular + como operador debido a la forma en que funciona el analizador. Las sugerencias de Steve son su mejor opción, aparte de quizás definir una función de acceso directo p <- function (...) paste (..., sep = "") que puede ser más fácil de escribir que el habitual paste() con sep = " ". –

+1

Bien, entonces finalmente encontramos un contraejemplo a la fortuna (109). Más exactamente, la respuesta es "escribe tu maldito analizador" :) –

Cuestiones relacionadas