Pregunta Antonio Sánchez Chinchón cómo mejorar la parte menos vistosa e imaginativa de esto, es decir, el código. Él, y muchos diríamos que correctamente, autocritica el uso de eval + parse para plagar el namespace de funciones.
La respuesta está en la recurrencia. He aquí mi versión del código:
library(ggplot2) library(gridExtra) nrows <- 6 coefs.a <- runif(min=1, max=50, nrows) coefs.b <- runif(min=1, max=50, nrows) foo.a <- sample(c(sin, cos), nrows, replace = TRUE) foo.b <- sample(c(sin, cos), nrows, replace = TRUE) foo <- function(x, a, b){ if(a == 1 || b == 1) return(foo.a[[a]](coefs.a[a] * x)) if(b == a) return(foo.b[[a]](coefs.b[a] * x)) foo(x, a-1, b) + foo(x, a-1, b-1) } vplayout = function(x, y) viewport(layout.pos.row = x, layout.pos.col = y) opts=theme(legend.position="none", panel.background = element_rect(fill="gray95"), plot.background = element_rect(fill="gray95", colour="gray95"), panel.grid = element_blank(), axis.ticks=element_blank(), axis.title=element_blank(), axis.text =element_blank()) grid.newpage() jpeg(file="AddingWaves.jpeg", width = 1800, height = 1000, bg = "gray95", quality = 100) pushViewport(viewport(layout = grid.layout(nrows, 2*nrows-1))) for (i in 1:nrows) { for (j in 1:i) { print(ggplot(data.frame(x = c(0, 20)), aes(x)) + stat_function(fun = function(x) foo(x, i, j), colour = "black", alpha=.75)+opts, vp = vplayout(i, nrows+(2*j-(i+1)))) } } dev.off() El resultado es
...