¿Es posible encadenar funciones en R?Método de encadenamiento con R
datos de la muestra:
m <- matrix(c(1:10, 11:20), nrow = 10, ncol = 2)
Por ejemplo, me gustaría sustituir las siguientes afirmaciones siguientes:
step1 <- mean(m)
step2 <- sum(step1)
res <- step2
O
res <- sum(mean(m))
Con algo como esto:
res <- [email protected]()@sum()
En algunos casos, eso aclararía mi código considerablemente.
EDIT1 Este es un ejemplo ficticio. Escogí al azar 'suma' y 'significa'.
Ben ha dado una primera pieza de respuesta utilizando% @%, sin embargo, que impide utilizar argumentos adicionales dentro de las funciones:
m %@% function1(arg1, arg2) %@% function2(arg1, arg2)
¿Cómo puedo evitar eso?
Edit2 Adición de un ejemplo
require(xts)
require(PerformanceAnalytics)
xts.ts <- xts(rnorm(231),as.Date(13514:13744,origin="1970-01-01"))
plot(na.omit(lag(rollapply(xts.ts, width=rolling.per-1, FUN= function(x){sqrt(var(x))*sqrt(252)}), k=1)), main = "Dummy Example")
Este ejemplo parece funcionar bien con una solución de Charles:
`%@%` <- function(x, f) eval.parent(as.call(append(as.list(substitute(f)), list(x), 1)))
xts.ts %@% rollapply(width = rolling.per-1, FUN= function(x) x%@%var%@%sqrt * sqrt(252)) %@% lag(k=1) %@% na.omit %@% plot(main = "Dummy Example")
menos importante para mi caso, pero valió la pena mencionar, la siguiente DECLARACIÓN falla con solución de Charles :
xts.ts %@% names <- 'ts name'
¿Qué pasa con 'res <- sum (mean (m))'? –
Nada, pero no tiene mucho sentido tomar la 'suma 'de un vector de longitud 1 (que es lo que se devuelve con' mean' en una matriz). – Henrik
Aunque se irá "pronto", todavía hay una función 'mean.data.frame' que devuelve un vector. –