R lazy evaluation

Advanced R Programming

以上为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()函数

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"


你可能感兴趣的:(R)