1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
library("future")
library("graphics")
plot_what_is_done <- function(counts) {
for (kk in seq_along(counts)) {
f <- counts[[kk]]
## Already plotted?
if (!inherits(f, "Future")) next
## Not resolved?
if (!resolved(f)) next
message(sprintf("Plotting tile #%d of %d ...", kk, n))
counts[[kk]] <- value(counts[[kk]])
screen(kk)
plot(counts[[kk]])
}
counts
}
## Options
region <- getOption("future.demo.mandelbrot.region", 1L)
if (!is.list(region)) {
if (region == 1L) {
region <- list(xmid = -0.75, ymid = 0.0, side = 3.0)
} else if (region == 2L) {
region <- list(xmid = 0.283, ymid = -0.0095, side = 0.00026)
} else if (region == 3L) {
region <- list(xmid = 0.282989, ymid = -0.01, side = 3e-8)
}
}
nrow <- getOption("future.demo.mandelbrot.nrow", 3L)
resolution <- getOption("future.demo.mandelbrot.resolution", 400L)
delay <- getOption("future.demo.mandelbrot.delay", interactive())
if (isTRUE(delay)) {
delay <- function(counts) Sys.sleep(rexp(1, rate = 2))
} else if (!is.function(delay)) {
delay <- function(counts) {}
}
## Generate Mandelbrot tiles to be computed
Cs <- mandelbrot_tiles(xmid = region$xmid, ymid = region$ymid,
side = region$side, nrow = nrow,
resolution = resolution)
if (interactive()) {
if (.Platform$GUI == "RStudio") {
if (!"RStudioGD" %in% names(dev.list())) dev.new()
}
dev.new()
plot.new()
split.screen(dim(Cs))
for (ii in seq_along(Cs)) {
screen(ii)
par(mar = c(0, 0, 0, 0))
text(x = 1 / 2, y = 1 / 2, sprintf("Future #%d\nunresolved", ii), cex = 2)
}
} else {
split.screen(dim(Cs))
}
counts <- list()
n <- length(Cs)
for (ii in seq_len(n)) {
message(sprintf("Mandelbrot tile #%d of %d ...", ii, n))
C <- Cs[[ii]]
counts[[ii]] <- future({
message(sprintf("Calculating tile #%d of %d ...", ii, n))
fit <- mandelbrot(C)
## Emulate slowness
delay(fit)
message(sprintf("Calculating tile #%d of %d ... done", ii, n))
fit
})
## Plot tiles that are already resolved
counts <- plot_what_is_done(counts)
}
## Plot remaining tiles
repeat {
counts <- plot_what_is_done(counts)
if (!any(sapply(counts, FUN = inherits, "Future"))) break
}
close.screen()
message("SUGGESTION: Try to rerun this demo after changing strategy for how futures are resolved, e.g. plan(multiprocess).\n")
|