我遇到了这个R代码,
f <- function(x) {
g <- function(y) {
y + z
}
z <- 4
x + g(x)
}
我似乎无法理解如果使用以下参数运行它会是什么答案
z <- 10
f(3)
g 是一个函数,在被调用之前不会执行。当你用g(x(调用g时,当时z = 4。
对于 x = 3;
x + g(x( = 3 + g(3( = 3 +(3 + 4( = 10
让我们分解一下。该函数:
f <- function(x) {
g <- function(y) {
y + z
}
z <- 4
x + g(x)
}
包含函数g
。直到最后一行才调用此函数,因此直到该点之前它不会尝试访问任何变量。因此,我们可以在调用它时安全地用相同的匿名函数替换它:
f <- function(x) {
z <- 4
x + (function(y){y + z})(y = x)
}
现在我们可以清楚地看到,在函数的第一行中分配的z
将在最后一行中使用,这意味着我们全局声明的z
将被忽略,因此我们可以进一步简化:
f <- function(x) {
x + (function(y){y + 4})(y = x)
}
那么我们如何计算出这给了我们什么呢?好吧,用(y = x)
调用函数function(y){y + 4}
与计算{x + 4}
相同,因此我们的函数变为:
f <- function(x) {
x + ({x + 4})
}
可以进一步简化为
f <- function(x) 2 * x + 4
您可以看到我们已经从函数中删除了符号g
、y
和z
,而不更改其输出。此外,我们可以看到,在全局环境中分配给z
的内容并不重要,因为它从未在函数中使用过。
使用上述任何函数,由于它们在逻辑上都是等效的,因此您将获得相同的输出。也就是说,无论您用什么数字调用函数,它都会加倍并添加 4。
f(3)
#> [1] 10