ticks mtext r wolfram-mathematica associativity magrittr

mtext - text in r



¿Es posible la asociatividad del operador de derecha a izquierda en R? (3)

¿Qué hay de usar compose desde el paquete purrr de hadley?

compose(sum,abs,round,c)(1.5,-2.3,3.4)

Soy nuevo en R, y acabo de descubrir que sufro de Fobia al Bracket (ver comentario en el enlace). Me gusta la forma en que funciona magrittr notation %>% , porque evita paréntesis anidados en algunas situaciones y hace que el código sea más legible. Vengo de Mathematica , donde hay una notación nativa // muy similar para hacer lo que %>% hace. Aquí están algunas comparaciones de R y Mathematica:

#R Notation c(1.5,-2.3,3.4) %>% round %>% abs %>% sum

#Mathematica Notation {1.5,-2.3,3.4}//Round//Abs//Total

Hasta ahora todo bien, pero mi pregunta es:

¿Hay alguna manera de imitar Mathematica @ notation , con asociatividad de derecha a izquierda en R ?

Así es como funciona en Mathematica, para resolver el mismo código anterior:

Total@Abs@Round@{1.5,-2.3,3.4}

En Mathematica también se puede escribir como:

Total[Abs[Round[{1.5,-2.3,3.4}]]]

Al igual que en R sería:

sum(abs(round(c(1.5,-2.3,3.4))))

Pero sería mucho más limpio (y genial) tener en R algo como esto:

sum@abs@round@c(1.5,-2.3,3.4)

PD: Sé que @ se usa en las clases de S4, y no es una buena idea. Esto es sólo una comparación ilustrativa.


El paquete backpipe fue diseñado y creado para este propósito. Proporciona un operador de tubería posterior (de derecha a izquierda) para magrittr , pipeR y, en general, para cualquier operador de tubería delantera. Backpipe se puede encontrar en github y en CRAN .

library(magrittr) # or library(pipeR) library(backpipe) x <- c(1.5,-2.3,3.4) sum %<% abs %<% round %<% x all.equal( # TRUE x %>% round %>% abs %>% sum, sum %<% abs %<% round %<% x )

La tubería trasera tampoco está limitada por parámetros adicionales, como es el caso de la solución de @BenBolker. Esto, por ejemplo, funciona con backpipe :

mean(na.rm=TRUE) %<% c(1:3,NA)

Vea también la discusión sobre el github.com/smbache/magrittr/issues/26 que discute esto.


No he probado / pensado en esto con cuidado, pero la definición de la composición de la función a través de un operador (como se muestra a continuación) parece funcionar en un par de casos de prueba:

library(magrittr) ## operator defined as "left-pointing arrow" at the ## suggestion of @ClausWilke: "%<%" <- function(x,y) { if (is(y,"function")) function(z) x(y(z)) else x(y) } x <- c(1.5,-2.3,3.4) all.equal(x %>% round %>% abs %>% sum, sum %<% abs %<% round %<% x) x <- rnorm(1000) all.equal(x %>% round %>% abs %>% sum, sum %<% abs %<% round %<% x)

La sintaxis no es tan agradable como poder usar un solo carácter (como @ ) para el operador de composición, pero incluso si pudiera encontrar uno no utilizado (todos los obvios [!@#$%^&*~|] se toman, y enmascararlos sería una idea terrible) hay una limitación del analizador: los operadores binarios definidos por el usuario en R deben tener la forma %?% .