繁体   English   中英

改变R的父母关闭环境(一个好主意)?

[英]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的要点非常明显。 现在的问题是(我明白这部分是主观的):

  1. 在R中,这种仅为其副作用制作功能的策略怎么样?
  2. 这种编程模式在R中是“禁忌”吗? 除了最高级别之外,我没有看到太多的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM