[英]Understanding scoping of nested functions
我试图通过将脚本拆分为多个函数来重构脚本,具有主函数和“帮助函数”。 在这里,我偶然发现了一个问题,可以简化为以下示例:
g <- function(a,b){ # help function
a^2 + b^2 - c
}
f <- function(a,b,c,d){ # main function
g(a,b)
}
这里的问题是, f
无法计算,因为g
不知道c
是什么,但为什么会这样呢?
我在这里读到,如果 R 不知道函数中的变量/参数,它会在外部函数/环境中搜索缺少的变量/参数。
为什么g
仍然不知道f
声明的值c
?
R使用词法作用域这意味着如果一个函数需要引用该功能,它看起来在该函数被定义,而不是调用者的环境没有定义的对象。 在问题中,g 是在全局环境中定义的,这就是 g 寻找 c 的地方。
另请注意,在 R 中,我们不会调用问题嵌套函数中的函数。 相反,嵌套的是调用,而不是函数。 在下面的 (3) 中,我们展示了嵌套函数。
1)我们可以重置一个函数的环境,在这种情况下它会认为它是在那个环境中定义的。
g <- function(a,b){ # help function
a^2 + b^2 - c
}
f <- function(a,b,c,d){ # main function
environment(g) <- environment()
g(a,b)
}
f(1, 2, 3, 4)
## [1] 2
2)另一种可能性是使用envir$c(其中envir 是所需的环境)或get("c",envir) 或with(envir, c) 明确告诉它要搜索哪个环境。 环境 $c 将调查环境。 另外两个将在那里查看,如果没有找到,将查看祖先环境。 (每个环境都有一个父级或 emptyenv()。这与调用堆栈不同。)
g <- function(a, b, envir = parent.frame()){ # help function
a^2 + b^2 - envir$c
}
f <- function(a,b,c,d){ # main function
g(a,b)
}
f(1, 2, 3, 4)
## [1] 2
3)我们可以嵌套函数,以便在 f 中定义 g。
f <- function(a,b,c,d){ # main function
g <- function(a,b){ # help function
a^2 + b^2 - c
}
g(a,b)
}
f(1, 2, 3, 4)
## [1] 2
4)当然你可以通过 c 并避免所有这些问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.