11.3 Case study: make your own function operator
urls <- c(
"adv-r" = "https://adv-r.hadley.nz",
"r4ds" = "http://r4ds.had.co.nz/"
# and many many more
)
path <- paste(tempdir(), names(urls), ".html")
walk2(urls, path, download.file, quiet = TRUE)
Here we make a function operator that add a little delay in reading each page:
delay_by <- function(f, amount) {
force(f)
force(amount)
function(...) {
Sys.sleep(amount)
f(...)
}
}
system.time(runif(100))
#> user system elapsed
#> 0 0 0
system.time(delay_by(runif, 0.1)(100))
#> user system elapsed
#> 0.0 0.0 0.1
And another to add a dot after nth invocation:
dot_every <- function(f, n) {
force(f)
force(n)
i <- 0
function(...) {
i <<- i + 1
if (i %% n == 0) cat(".")
f(...)
}
}
walk(1:100, dot_every(runif, 10))
#> ..........
Can now use both of these function operators to express our desired result: