我仍在努力寻找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
答案 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