我还没有看到很多(流行的)关于功能环境操作/在R中使用<<-
的文献(除adv-r之外)。特别是,对于这些事情,R的禁忌是什么。要使其成为具体问题,请考虑以下功能:
appendOne <- function(env=parent.frame()) {
tmp <- function(.x) {
eval(substitute(.x <<- c(.x, "1")))
}
parent.env(environment(tmp)) <- env
return(tmp)
}
g <- function() {
.y <- 4
appendOne()(.y)
.y
}
appendOne非常明显。现在的问题是(我明白这部分是主观的):
eval
- substitute
模式的大部分内容。这是因为很难向初学者解释,还是因为它不被鼓励?答案 0 :(得分:1)
功能编程极大地鼓励了功能的构建,副作用最小。这样做的原因是,如果函数没有副作用,则可以完整地证明其行为的完整性 - 它不会修改其本地环境之外的任何内容。
但是,可能有充分的理由使用eval(substitute(...))
模式“进入”调用环境 - 即出于优化目的,以及显着改进的非标准评估用户的体验。
例如,在我的一个软件包中,我perform a very complicated evaluation in the calling environment,非常小心不要定义任何偶然的局部变量,因为我非常关心优化而不想下降到C。
例如,如果将数据帧传递给函数,在该数据帧的一列上进行修改,然后将其返回,则R将复制整个数据帧。您可以将其包装在仅包含该数据帧的环境中,但这也会使事情变得更难理解。如果您知道用户知道底层函数的副作用,则使用非标准评估可以提高性能:
(function(df) eval.parent(substitute(df[[1]] <- 2 * df[[1]])))(iris)