相关疑难解决方法(0)

解释一个懒惰的评价怪癖

我正在阅读Hadley Wickhams关于Github的书,特别是关于懒惰评估的这一部分.在那里,他举例说明了懒惰评估的后果,在有add/adders功能的部分.让我引用一下:

在使用lapply或循环创建闭包时,[懒惰评估]很重要:

add <- function(x) {
  function(y) x + y
}
adders <- lapply(1:10, add)
adders[[1]](10)
adders[[10]](10)
Run Code Online (Sandbox Code Playgroud)

在第一次调用其中一个加法器函数时,会对x进行延迟计算.此时,循环完成,x的最终值为10.因此,所有加法器函数都会在其输入上添加10,可能不是您想要的!手动强制评估修复了问题:

add <- function(x) {
  force(x)
  function(y) x + y
}
adders2 <- lapply(1:10, add)
adders2[[1]](10)
adders2[[10]](10)
Run Code Online (Sandbox Code Playgroud)

我似乎不明白那一点,而且那里的解释很少.有人可以详细说明这个特定的例子,并解释那里发生了什么?我特别对句子感到困惑"此时,循环完成,x的最终值为10".什么循环?什么最终价值,在哪里?一定是简单的我想念,但我只是没有看到它.非常感谢提前.

r lazy-evaluation

60
推荐指数
2
解决办法
4003
查看次数

当未提供函数的参数但用于对向量进行子集化时,R不报告错误

为什么在没有提供b但在函数内部需要时没有报告错误?谢谢!

f2 <- function(a,b) {a[b]}; f2(a=rep(1, 2))
Run Code Online (Sandbox Code Playgroud)

我知道这个函数没有错误:

f <- function(x) {
  10
}
f(stop("This is an error!"))
Run Code Online (Sandbox Code Playgroud)

由于懒惰的评价但是这个

f <- function(x) {
  force(x)
  10
}
f(stop("This is an error!"))
Run Code Online (Sandbox Code Playgroud)

或这个

f <- function(x) {
  x
  10
}
f(stop("This is an error!"))
Run Code Online (Sandbox Code Playgroud)

会产生错误.因为在这两种情况下都在函数中使用 x .以上两个例子都来自http://adv-r.had.co.nz/Functions.html.由于B也使用 F2内,应该有必要增加内部F2力?谢谢!

arguments r function parameter-passing

6
推荐指数
1
解决办法
148
查看次数