[英]changing parent environment of closure in R (a good idea)?
我没有看到很多(流行的)文献关于功能环境的操纵/使用<<-
在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
模式。 这是因为很难向初学者解释,还是因为不鼓励? 功能编程大大鼓励功能的构建,副作用最小。 这样做的原因是,如果函数没有副作用,则可以完整地证明其行为的完整性 - 它不会修改其自身本地环境之外的任何内容。
但是,可能有充分的理由使用eval(substitute(...))
模式“进入”调用环境 - 即出于优化目的,以及显着改善用户体验的非标准评估。
例如,在我的一个软件包中,我在调用环境中执行一个非常复杂的评估 ,非常小心不要定义任何偶然的局部变量,因为我非常关心优化并且不想下降到C.
例如,如果将数据帧传递给函数,在该数据帧的一列上进行修改,然后将其返回,则R将复制整个数据帧。 您可以将其包装在仅包含该数据帧的环境中,但这也会使事情变得更难理解。 如果您知道用户知道底层函数的副作用,则使用非标准评估可以提高性能:
(function(df) eval.parent(substitute(df[[1]] <- 2 * df[[1]])))(iris)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.