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 %?%
.