Установите для среды функций среду вызова (parent.frame) из функции
Я все еще борюсь с R scoping и окружающей средой. Я хотел бы иметь возможность создавать простые вспомогательные функции, которые вызываются из моих "основных" функций, которые могут напрямую ссылаться на все переменные в этих основных функциях, но я не хочу определять вспомогательные функции в каждой из моих основных функций. функции.
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 ответа
Ну, функция не может изменить среду по умолчанию, но вы можете использовать eval
запустить код в другой среде. Я не уверен, что это точно считается элегантным, но это должно работать:
helpFunction<-function(){
eval(quote(importantVar1+1), parent.frame())
}
mainFunction<-function(importantVar1){
return(helpFunction())
}
mainFunction(importantVar1=3)
Если вы объявите каждую из ваших функций для использования с динамической областью действия в начале основной функции, как показано в примере ниже, она будет работать. С помощью helpFunction
определены в вопросе:
mainfunction <- function(importantVar1) {
# declare each of your functions to be used with dynamic scoping like this:
environment(helpFunction) <- environment()
helpFunction()
}
mainfunction(importantVar1=3)
Источник самих вспомогательных функций не нуждается в изменении.
Кстати, вы можете захотеть заглянуть в Reference Classes или в пакет proto, поскольку кажется, что вы пытаетесь делать объектно-ориентированное программирование через черный ход.
Путь 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
Изменить, так как вы утверждаете, что это "не работает":
helpFunction<-function(importantVar1){
importantVar1+1
}
mainFunction<-function(importantVar1){
helpFunction(importantVar1)
}
mainFunction(importantVar1=3)
#[1] 4