r - 理解嵌套函数的作用域
问题描述
我试图通过将脚本拆分为多个函数来重构脚本,具有一个主函数和“帮助函数”。在这里,我偶然发现了一个可以简化为以下示例的问题:
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
仍然不知道由c
声明的值f
?
解决方案
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) 明确告诉它要搜索的环境。envir$c 将查看 envir。另外两个将在那里寻找,如果没有找到,将寻找祖先环境。(每个环境都有一个父级或 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 并避免所有这些问题。
推荐阅读
- python - 保存具有体素尺寸的 nibabel 图像
- matplotlib - 如何在不每次都添加新颜色条的情况下更新图像
- sql-server - SQL Server:如何从 sys.master_files 获得正确的数据库大小?
- java - 为什么我不能滚动到 ListView 的末尾?
- error-handling - 尝试获取输出消息时 ADF eroor
- node.js - 手动向客户端发送 cookie 以进行快速会话
- node.js - 在 Promise 链中调用异步方法时出现“TypeError:X 不是函数”
- python-3.x - lambda 函数上的 aws-xray-sdk
- c++ - 添加到 QQueue 崩溃程序
- java - 如何在 Android 中使用带有 setText 的 HTML 变量?