2009-08-25 26 views
18

Esta es una pregunta muy básica, pero aparentemente google no es muy buena para buscar cadenas como "% +%". Entonces, mi pregunta es: ¿qué y cuándo se usa "% +%" y similares? Supongo que es una especie de fusión ?.¿Qué significa, por ejemplo,% +% do? en R

EDIT: Ok - Creo que mi pregunta es respondida. % X% es un operador binario de algún tipo. Así que ahora creo que buscaré en Google conocimiento sobre cómo y cuándo usarlos. Mi pregunta fue inspirada en parte por la pregunta de ayer, pero solo después de ver este post en el blog "learning R". El pasaje que dio lugar a mi pregunta fue este:
Para hacer esto, se creará un nuevo marco de datos con los totales anuales y luego se fusionará con el conjunto de datos existente (los nombres de las variables en ambos marcos de datos deberían ser idénticos para que funcionen) . Luego, solo cambiamos el marco de datos en el que se basa la trama.

## add total immigration figures to the plot 
total <- cast(df.m, Period ~ ., sum) 
total <- rename(total, c("(all)" = "value")) 
total$Region <- "Total" 
df.m.t <- rbind(total, df.m) 
c1 <- c %+% df.m.t 
+0

En el ejemplo del código de su 'EDIT', casi seguramente quiere '+' y no '% +%'. –

Respuesta

24

La razón última es que si hace tanto programación de propósito general como cálculos numéricos, es útil tener disponible un gran complemento de operadores binarios. Por ejemplo, si almacena números en matrices bidimensionales, es posible que desee multiplicar las matrices por elementos, o puede calcular el producto de matriz de dos matrices. En Matlab estos dos operadores son .* y *; en R son * y %*%. Python tiene resistedattempts para agregar nuevos operadores, por lo que numpy diferencia entre los dos tipos de producto al tener dos clases: la clase de matriz se multiplica elemento, la clase de matriz se multiplica en el sentido de álgebra lineal.

Otro ejemplo de Python es que para listas, más significa concatenación: [1,2,3]+[4,5] == [1,2,3,4,5]. Pero para matrices numpy, plus significa adición por elementos: array([1,2]) + array([4,5]) == array([5,7]). Si su código necesita hacer ambas cosas, debe convertir entre clases o utilizar la notación de funciones, lo que puede generar un código de aspecto engorroso, especialmente en lo que respecta a las matemáticas.

Por lo tanto, a veces sería conveniente tener más operadores disponibles para su uso, y es posible que no sepa de antemano qué tipo de operadores requiere una aplicación en particular. Por lo tanto, los implementadores de R han elegido tratar como operadores cualquier nombre llamado %foo%, y existen varios ejemplos: %in% es membresía establecida, %x% es producto Kronecker, %o% es producto externo. Para obtener un ejemplo de un lenguaje que ha llevado esto al extremo, consulte Fortress (la sección 16 de la especificación comienza con las reglas para nombres de operador).

En la publicación del blog que mencionas, el autor está utilizando el paquete de gráficos ggplot2, que define %+% como un tipo de combinación de dos elementos de la gráfica.Realmente parece agregar un método al bare + (que es una función genérica para que pueda definir lo que significa para los objetos definidos por el usuario), pero también define %+% para que pueda usar el significado ggplot2 de + (lo que sea que sea) para otros objetos. Si instala ggplot2, escriba require(ggplot2) y ?`%+%` para ver la documentación de ese operador, y methods(`+`) para ver que se haya agregado una nueva definición a +.

+0

wauw - muchas gracias Jouni! ¡Qué excelente respuesta! Todo comienza a tener sentido ahora :-) – Andreas

+0

[Python 3.5 agrega un nuevo operador binario] (https://www.python.org/dev/peps/pep-0465/), '@' , que NumPy usará para la multiplicación de la matriz. – unutbu

1

Con base en mi mirada rápida a la manual puede ser una definida por el usuario operador infijo, así, es difícil decir cuál sería el significado real ...

yo creo que la adición binaria.

+0

Solo el simple + es una adición binaria, creo -% +% no parece tener nada asignado. Prueba aritmética para más información. –

15

No existe un %+% generalmente definido. Tal vez miraste this question from yesterday donde se definió

R> '%+%' <- paste 
R> "foo" %+% "bar" 
[1] "foo bar" 
R> 

y la función de concatenación de cadenas ad-hoc. En general, la sintaxis 'percent-operator-percent' está abierta para las funciones definidas por el usuario de dos argumentos, pero no existe (AFAIK) ninguna versión generalmente aceptada para %+% que pueda estar presente en todas partes.

Cuestiones relacionadas