R 嵌套函数调用



我遇到了这个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

您可以看到我们已经从函数中删除了符号gyz,而不更改其输出。此外,我们可以看到,在全局环境中分配给z的内容并不重要,因为它从未在函数中使用过。

使用上述任何函数,由于它们在逻辑上都是等效的,因此您将获得相同的输出。也就是说,无论您用什么数字调用函数,它都会加倍并添加 4。

f(3)
#> [1] 10

最新更新