library(wesanderson) library(dplyr) COL <- wes_palette("Cavalcanti", 5) COL[5] <- '#f03b20' COL[4] <- '#bd0026' d <- density(faithful$eruptions, adjust = .25) maxit <- 9 m <- data.frame("ind" = 1:2^maxit, "membership_old" = rep(2^maxit, 2^maxit), "membership_new" = rep(2^maxit, 2^maxit), "size" = rep(2^maxit, 2^maxit), "xmin_old" = rep(min(d$x), 2^maxit), "xmax_old" = rep(max(d$x), 2^maxit), "xmin_new" = rep(min(d$x), 2^maxit), "xmax_new" = rep(max(d$x), 2^maxit), "L_old" = rep(min(d$y), 2^maxit), "U_old" = rep(max(d$y), 2^maxit), "L_new" = rep(min(d$y), 2^maxit), "U_new" = rep(max(d$y), 2^maxit), "envelope_old" = rep(max(d$y) - min(d$y), 2^maxit), "envelope_new" = rep(max(d$y) - min(d$y), 2^maxit), "active_old" = rep(1, 2^maxit), "active_new" = rep(1, 2^maxit), "active_newest" = rep(1, 2^maxit)) branchNbound <- function(m, d, it, epsilon) { i <- 1 repeat { names(m)[c(2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17)] <- names(m)[c(2, 3, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17)][c(2, 1, 5, 6, 3, 4, 9, 10, 7, 8, 12, 11, 15, 13, 14)] m <- m %>% group_by(membership_old) %>% # branch mutate(membership_new = ifelse(active_new, ifelse((membership_old - size) < ind & ind <= (membership_old - size/2), membership_old - size/2, membership_old), membership_old)) %>% mutate(size = ifelse(active_new, size/2, size)) %>% mutate(xmin_new = ifelse(membership_new == membership_old & active_new == 1, (xmax_old - xmin_old)/2 + xmin_old, xmin_old)) %>% mutate(xmax_new = ifelse(membership_new < membership_old & active_new == 1, (xmax_old - xmin_old)/2 + xmin_old, xmax_old)) %>% ungroup() %>% group_by(membership_new) %>% # bound mutate(L_new = min(d$y[xmin_new < d$x & d$x < xmax_new])) %>% mutate(U_new = max(d$y[xmin_new < d$x & d$x < xmax_new])) %>% mutate(envelope_new = U_new - L_new) %>% # kill mutate(active_newest = ifelse(envelope_new < epsilon, 0, 1)) %>% ungroup() i <- i + 1 if (i > it) break } m } inputPanel( numericInput("eps", label = "epsilon", value = .1, min = .01, max = .5, step = .1), sliderInput("it", label = "iteration", min = 1, max = 24, value = 1, step = 1, animate = animationOptions(loop = F, interval=1500)), radioButtons("radio", label = "stage", choices = list("branch" = 1, "bound" = 2, "kill" = 3), selected = 2) ) renderPlot({ plot(range(d$x), range(d$y), type = "n", xlab = "x", ylab = "f(x)", bty = "n", xaxp = c(1, 5.5, 10)) m2 <- branchNbound(m, d, it = ceiling(input$it/3), epsilon = input$eps) segs <- unique(m2$membership_old) for (i in segs) { # bound seg_row <- m2 %>% filter(membership_old == i) %>% slice(1) lines(c(seg_row$xmin_old, seg_row$xmax_old), rep(seg_row$L_old, 2), col = COL[2], lwd = 3) lines(c(seg_row$xmin_old, seg_row$xmax_old), rep(seg_row$U_old, 2), col = COL[2], lwd = 3) if(seg_row$active_old) { lines(rep(seg_row$xmax_old, 2), c(-.2, 1.05 * max(d$y)), lty = 2, col = "lightgrey", lwd = 2) # (old branch) } if (seg_row$active_old + seg_row$active_new == 0) { # (old kill) seg_row_end <- m2 %>% filter(membership_old == i) %>% slice(n()) polygon(c(seg_row$xmin_old, seg_row_end$xmax_old, seg_row_end$xmax_old, seg_row$xmin_old), c(seg_row$L_old, seg_row$L_old, seg_row$U_old, seg_row$U_old), col = COL[4], border = NA) } if (input$it %in% seq(2, 24, 3)) { # new kill updateRadioButtons(session, "radio", selected = 3) if (seg_row$active_old + seg_row$active_new == 1) { seg_row_end <- m2 %>% filter(membership_old == i) %>% slice(n()) polygon(c(seg_row$xmin_old, seg_row_end$xmax_old, seg_row_end$xmax_old, seg_row$xmin_old), c(seg_row$L_old, seg_row$L_old, seg_row$U_old, seg_row$U_old), col = COL[5], border = NA) } } if (input$it %in% seq(3, 24, 3)) { # recent kill if (seg_row$active_old + seg_row$active_new == 1) { seg_row_end <- m2 %>% filter(membership_old == i) %>% slice(n()) polygon(c(seg_row$xmin_old, seg_row_end$xmax_old, seg_row_end$xmax_old, seg_row$xmin_old), c(seg_row$L_old, seg_row$L_old, seg_row$U_old, seg_row$U_old), col = COL[4], border = NA) } } } lines(d, col = COL[1], lwd = 3) if (input$it %in% seq(3, 24, 3)) { # branch seg_split <- m2$membership_new[!m2$membership_new == m2$membership_old] for(i in seg_split) { seg_row <- m2 %>% filter(membership_new == i) %>% slice(1) lines(rep(seg_row$xmax_new, 2), c(-.2, 1.05 * max(d$y)), lty = 2, col = "darkgrey", lwd = 2) } } }, width = 800)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.