Установите для среды функций среду вызова (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
Другие вопросы по тегам