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

时间:2014-03-29 23:30:43

标签: r functional-programming

我还没有看到很多(流行的)关于功能环境操作/在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. 中,这种仅为其副作用制作功能的策略是多么危险?
  3. 这种编程模式&#34;禁忌&#34;在R?除了最高级别之外,我没有看到eval - substitute模式的大部分内容。这是因为很难向初学者解释,还是因为它不被鼓励?

1 个答案:

答案 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)