2016-02-29 2 views
0

Я пытаюсь выяснить, как разрешить функции напрямую изменять или создавать переменные в родительской среде, независимо от того, является ли родительская среда глобальной средой или другой функцией.Позволяет R-функциям напрямую изменять родительскую среду

Например, если у меня есть функция

my_fun <- function(){ 
    a <- 1 
} 

Я хотел бы призыв к my_fun(), чтобы получить те же результаты, что делает a <- 1.

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

my_fun <- function(){ 
    env = parent.frame() 
    env$a <- 1 
} 
+4

Это путь к темной стороне. – jogo

+2

Я бы не рекомендовал это. –

+0

Почему у вас есть требование изменить vars в родительском env? – rbm

ответ

5

Попробуйте with:

g <- function(env = parent.frame()) with(env, { b <- 1 }) 

g() 

b 
## [1] 1 

Обратите внимание, что, как правило, предпочтительно, чтобы передать переменные в качестве возвращаемых значений, а не непосредственно создавать их в родительском фрейме. Если вы возвращаете много переменных, вы всегда можете вернуть их в список, например. h <- function() list(a = 1, b = 2); result <- h() Теперь result$a и result$b имеют значения a и b.

См. Также Function returning more than one value.

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