从函数内部将函数环境设置为调用环境(parent.frame)的函数环境

时间:2014-05-27 13:17:13

标签: r function environment-variables scoping

我仍在努力寻找R范围和环境。我希望能够构建简单的辅助函数,这些函数可以从我的主要函数调用。可以直接引用这些主函数中所有变量的函数 - 但我不想在每个主函数中定义辅助函数。

helpFunction<-function(){
#can I add a line here to alter the environment of this helper function to that of the calling function?
return(importantVar1+1)
}

mainFunction<-function(importantVar1){
return(helpFunction())
}

mainFunction(importantVar1=3) #so this should output 4

3 个答案:

答案 0 :(得分:19)

如果您声明要在main函数开头使用动态范围的每个函数,如下例所示,它将起作用。使用问题中定义的helpFunction

mainfunction <- function(importantVar1) {

    # declare each of your functions to be used with dynamic scoping like this:
    environment(helpFunction) <- environment()

    helpFunction()
}

mainfunction(importantVar1=3)

不需要修改辅助函数本身的来源。

顺便说一下,您可能希望查看引用类或原型包,因为看起来好像您正试图通过后门进行面向对象的编程。

答案 1 :(得分:6)

好吧,函数不能改变它的默认环境,但是你可以使用eval在不同的环境中运行代码。我不确定这完全符合优雅,但这应该有效:

helpFunction<-function(){
    eval(quote(importantVar1+1), parent.frame())
}

mainFunction<-function(importantVar1){
    return(helpFunction())
}

mainFunction(importantVar1=3)

答案 2 :(得分:4)

R方式将传递函数参数:

helpFunction<-function(x){ 
#you can also use importantVar1 as argument name instead of x
#it will be local to this helper function, but since you pass the value
#it will have the same value as in the main function
  x+1
}

mainFunction<-function(importantVar1){
  helpFunction(importantVar1)
}

mainFunction(importantVar1=3)
#[1] 4

编辑,因为您声称它&#34;不起作用&#34;:

helpFunction<-function(importantVar1){ 
  importantVar1+1
}

mainFunction<-function(importantVar1){
  helpFunction(importantVar1)
}

mainFunction(importantVar1=3)
#[1] 4