2014-05-27 3 views
6

Я все еще борюсь с областью обзора R и средой. Я хотел бы иметь возможность создавать простые вспомогательные функции, которые вызываются из моих «основных» функций, которые могут напрямую ссылаться на все переменные в этих основных функциях, но я не хочу определять вспомогательные функции в каждом из моих основных функции.Задайте среду функций, относящуюся к вызывающей среде (parent.frame) из функции

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 

ответ

5

Ну, функция не может изменить это среда по умолчанию, но вы можете использовать eval для запуска кода в другой среде. Я не уверен, что это именно квалифицируется как элегантный, но это должно работать:

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

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

mainFunction(importantVar1=3) 
+0

Спасибо. Иногда это будет полезно - ответ Гротендика очень похож, но мне нравится однолинейный подход. – Charlie

2

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 

Edit, так как вы утверждаете, это "не работает":

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

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

mainFunction(importantVar1=3) 
#[1] 4 
+0

Нет другого решения? Такой подход становится очень утомительным, когда многим переменным требуется произвольное переименование ... делает вспомогательные функции менее полезными. – Charlie

+0

Я не вижу, как этот подход требует переименования переменных? Если вы жестко закодируете имя переменной в свою вспомогательную функцию, которая кажется не очень полезной. – Roland

+0

Я работаю над пакетом, который делает много разных вещей на ограниченном диапазоне переменных, я думаю. Например, у меня есть переменная timepoints, релевантная для каждой функции, ее переопределение для каждой из них является громоздкой. – Charlie

12

Если вы объявляете каждого из ваших функций, которые будут использоваться с динамическим обзорного в начале mainfunction, как показано в примере ниже, он будет работать , Использование helpFunction определенных в вопросе:

mainfunction <- function(importantVar1) { 

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

    helpFunction() 
} 

mainfunction(importantVar1=3) 

Источник вспомогательных функций, сами по себе не должна быть изменена.

Кстати, вы можете захотеть взглянуть на эталонные классы или прото-пакет, поскольку кажется, что вы пытаетесь сделать объектно-ориентированное программирование через черный ход.

 Смежные вопросы

  • Нет связанных вопросов^_^