以编程方式确定R函数是否纯粹

时间:2016-07-13 18:16:05

标签: r

我会用Datacamp course Hadley Wickham来解释纯函数的定义:

  • 输出仅取决于输入
  • 不要更改功能之外的任何内容
    • 没有设置全局变量,没有绘图,没有打印到控制台等
  • 对于不同的用户或会话,没有任何可能不同的输入

如何以自动方式确定特定功能是否纯净?我曾考虑使用args()来检查默认值,但后来我不确定如何检查默认值是否为全局值。我已经考虑过检查函数来自哪个库,因为已知某些函数包含大多数纯函数。但我不认为这是一个100%有效的测试。

任何部分答案也会有所帮助。例如:如何确定函数是否创建绘图?如何确定功能是否打印到控制台?我想可以设计一个测试用例,但是显示许多正面结果并且没有找到否定结果也不是明确的证据。

1 个答案:

答案 0 :(得分:-2)

有趣的问题。要回答这些问题中的许多问题,您将不得不在环境中进行游戏。阅读this

这是您第一个问题的简单解决方案。问题可以定义如下。

y <- 1

f <- function(x){
  x + y
}

f(10)
[1] 11 

这是因为R的范围规则。当你在函数的调用框架(本地环境)中调用f() R时,如果找不到它想要的内容,它会向上移动到父环境,在这种情况下是工作空间(即{{1 }})。因此,一个简单的答案是将.GlobalEnv移至不在.GlobalEnv搜索路径上的其他环境,然后调用f()。例如,

f()

现在让我们将之前在全球环境中的对象移回

y <- 1

e <- new.env() #intitalizing a new environment 

#populating e with objects in `.GlobalEnv`
for(i in ls()[!grepl("e",ls())]){
  assign(i, globalenv()[[i]], envir = e)
}

rm(list = ls()[!grepl("e",ls())]) #removing everything from the global environment that is not our environment e

f <- function(x){
  x + y
}

f(10)

Error in f(10) : object 'y' not found

可能有更好的方法来做到这一点,但是,这是一个开始。我也确信,通过玩弄环境的想法,可以获得许多问题的答案。例如,关于全局变量的第二个问题可以通过比较函数调用之前和之后的全局环境来回答。或者将呼叫框架传递给全球环境进行检查。