我有一个例子,我不确定我是否理解 R 中的作用域,也不认为它在做正确的事情。该示例由 J. Fox 修改自“An R and S-PLUS Companion to Applied Regression”
> make.power = function(p) function(x) x^p
> powers = lapply(1:3, make.power)
> lapply(powers, function(p) p(2))
我在列表中所期望的三个函数分别计算恒等函数、平方函数和立方函数,但它们都将它们的参数立方化。如果我不使用 lapply,它会按预期工作。
> id = make.power(1)
> square = make.power(2)
> cube = make.power(3)
> id(2)
[1] 2
> square(2)
[1] 4
> cube(2)
[1] 8
我是唯一一个觉得这令人惊讶或不安的人吗?是否有一个深刻的令人满意的理由?谢谢
PS:我在 Google 和 SO 上进行了搜索,但是,可能由于与此问题相关的关键字的普遍性,我空手而归。
PPS:这个例子的动机是包 quickcheck 中的一个真正的错误,而不是纯粹的好奇。我有一个解决该错误的方法,感谢您的关注。这是关于学习的东西。
当然,在发布问题后,我想到了一个可以澄清问题的不同示例。
> p = 1
> id = make.power(p)
> p = 2
> square = make.power(p)
> id(2)
[1] 4
p 与隐藏在 lapply 中的循环变量具有相同的作用。p 由一个方法传递,在这种情况下,该方法看起来像对 make.power 的引用。Make.power 不评估它,只是保留一个指向它的指针。我在正确的轨道上吗?