【发布时间】:2014-03-29 23:30:42
【问题描述】:
我没有看到太多关于函数环境操作/在 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 的意义非常明显。现在的问题是(我知道这部分是主观的):
- 在 R 中,这种仅出于副作用而创建函数的策略是危险的吗?
- 这种编程模式在R中是“禁忌”吗?除了最高级别之外,我看不到太多
eval-substitute模式。这是因为它很难向初学者解释,还是因为它不被鼓励?
【问题讨论】:
-
对没有副作用的函数的偏好是functional programming 的标志。正如链接的维基百科页面的第一段所解释的那样,“消除副作用,即不依赖于函数输入的状态变化,可以更容易理解和预测程序的行为,这是关键之一开发函数式编程的动机。”
-
另外,FWIW,对
g()(或就此而言对appendOne())的函数调用会冻结我的 R 会话。 -
他试图在定义之前从
appendOne内部访问g。这将导致奇怪的行为。 -
糟糕!那是一个错字……已更正。