2014-01-17 5 views
5

У меня есть функция, которая создает среду внутри нее, и я хочу назначить эту среду для глобальной среды. В настоящее время я сделать это путем присвоения условий для globalenv() в качестве конечной стадии - следующим образом:эффективно перемещать среду изнутри функции в глобальную среду

funfun <- function(inc = 1){ 
    dataEnv <- new.env() 
    dataEnv$d1 <- 1 + inc 
    dataEnv$d2 <- 2 + inc 
    dataEnv$d3 <- 2 + inc 
    assign('dataEnv', dataEnv, envir = globalenv()) 
} 

Такое чувство, что я должен быть в состоянии сделать что-то сделать dataEnv persisit когда функция funfun концы (чтобы сохранить копирование окружающая среда в конце), однако мои попытки, такие как dataEnv <- new.env(parent = globalenv()), не сработали.

Почему это не удается? Это возможно?

Также, что является наиболее эффективным способом сделать это?

Мои таблицы очень большие время от времени, и копирование станет проблемой по мере роста проекта.

ответ

5

Вашей среду не разрушаются при выходе из функции. Вам просто нужно вернуть ссылку на него.

funfun <- function(inc = 1){ 
    dataEnv <- new.env(parent=globalenv()) 
    dataEnv$d1 <- 1 + inc 
    dataEnv$d2 <- 2 + inc 
    dataEnv$d3 <- rnorm(10000) 
    return(dataEnv) 
} 


myEnv <- funfun() 
object.size(myEnv) 

Получите некоторый материал

head(myEnv$d3) 
+0

Требуется ли возврат? Или достаточно ли просто иметь dataEnv в качестве конечной строки функции? Я вечно не уверен в обратных утверждениях в г. – ricardo

+0

возврат не требуется, вы можете просто положить значение в конце. Если у вас есть сомнения по поводу стиля, я недавно прочитал этот http://google-styleguide.googlecode.com/svn/trunk/Rguide.xml. Я думаю, что в каком-то примере они используют 'return'. Но это всего лишь вопрос вкуса. – Usobi

+0

Это похоже на вопрос «сбор мусора». Предположим, вы не вернули ссылку на окружающую среду? Как вы обнаруживаете существование 'dataEnv', так что если ничего больше вы не можете удалить, если не хотите? –

-1

Обычно, когда я хочу, чтобы назначить что-то глобальную среду я просто

varname <<- value 
+0

Привычка эта копия окружающей среды, которая находится внутри функции, она перемещает его изнутри наружу закрытия? – ricardo

+0

Да. Лично я бы пошел с ответом Усоби, но это то, что вы сделали бы, если бы вы хотели присвоить это имя конкретной переменной глобальной среде (которая выглядит так, как вы делали в предоставленном коде). 'myEnv << - dataEnv' будет кодом, который делает то же, что и выше. –

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