以上为R高级编程的地址。
今天看到function部分有一些好玩的机制想在此记录下来。
By default, R function arguments are lazy - they're only evaluated if they're actually used:
默认情况下,R函数的参数只有在真正使用时才会执行。
但是感觉这样的理解可能有点问题~~
f <- function(x) {
10
}
system.time(f(Sys.sleep(10)))
#> user system elapsed
#> 0 0 0
force <- function(x) x
强制执行
f <- function(x) {
force(x)
10
}
system.time(f(Sys.sleep(10)))
#> user system elapsed
#> 0 0 10
add <- function(x) {
function(y) x + y
}
adders <- lapply(1:10, add)
## 参数x在循环结束时的值为10
adders[[1]](10)
#> [1] 20
adders[[10]](10)
#> [1] 20
add <- function(x) {
force(x)
function(y) x + y
}
adders2 <- lapply(1:10, add)
adders2[[1]](10)
#> [1] 11
adders2[[10]](10)
#> [1] 20
f <- function(x = ls()) {
a <- 1
x
}
# ls() evaluated inside f:
f()
#> [1] "a" "x"
# ls() evaluated in global environment:
f(ls())
#> [1] "add" "adders" "adders2" "args" "collapse" "f"
#> [7] "g" "h" "i" "in_path" "j" "out_path"
#> [13] "x" "y"