2016-06-01 4 views
1

Я пытаюсь сохранить переменную из функции в глобальной среде, но ни одно из найденных мной решений SO post или different SO post не работало для меня. Это очень упрощенный пример, иллюстрирующий мою проблему. Я не могу просто использовать <<-, чтобы сделать v глобальным, потому что моя фактическая функция создает несколько десятков переменных.хранить переменные от функции в глобальной среде

Код (main_file.R)

source("function_me.R") 
#environment(doGlobalThing) <-parent.frame(2) #didnt work 
doGlobalThing() 
v #cant get to this var from the global environment 

Код (function_me.R)

doGlobalThing<-function(){ 
    #eval(v<-'hi',env=parent.frame(2)) #tried this, didnt work 
    v<-'hi' 
} 
+1

Не работайте с дизайном языка. Изучите функциональное программирование. – Roland

+0

@Roland. Можете ли вы объяснить (кратко), почему моя идея создания нового набора глобальных переменных неверна в глобальной глобальной среде EMPTY, основанной на некоторых принципах функционального программирования? – Rilcon42

+2

Нет абсолютно никакого преимущества в том, чтобы делать это, возвращая то, что вам нужно от функции, например, в списке. Однако, как вы заметили, это создает для вас бремя, что вы должны помнить, что ваша функция имеет эффекты сайта и гарантирует, что это не создает проблем. И, конечно же, это означает, что вы не можете действительно передавать свой код другим или легко использовать его. Единственная ситуация, когда это может иметь смысл, - это попытаться назначить по ссылке и изменить на месте, но тогда вы должны сделать это в другой среде, а не в глобальной (или использовать ссылочные классы). – Roland

ответ

4

Вы можете использовать assign:

assign("v","hi",envir = globalenv()) 

Это требует, чтобы у вас есть имя целевая глобальная переменная как строка, но это может быть легко сделать даже с вектором десятков таких вещей.

This question обсуждает различия между assign и <<-. Главное отличие состоит в том, что assign позволяет указать среду - поэтому ее легко использовать для хранения данных в неглобальной, но постоянной среде, чтобы вы могли, например, эмулировать статические переменные в R. Хотя для изменения глобальной среды можно использовать assign, вы должны знать, что это редко получается. Существует слишком большая опасность случайного перезаписи данных, которые вы не хотите перезаписывать. Код, который сильно использует глобальные переменные, почти всегда может быть реорганизован в более чистый код, который этого не делает. Если вам нужно получить много гетерогенных данных из функции в вызывающую среду, самым чистым решением было бы вернуть необходимые данные в список.

accepted answer заканчивает обсуждение <<- и assign с хорошей цитатой:

Злом и Неправильное использование модифицировать переменные в глобальной среды.

+0

Это правда, но я надеялся на более общее решение .... желательно метод, чтобы все переменные, созданные в глобальной функции с одним вызовом – Rilcon42

+0

Я мог бы так же легко использовать '<< -' в качестве вашего решения, хотя ваш был для меня новичком – Rilcon42

+0

TI сделать это за один вызов, использовать 'assign' в цикле' for' или 'apply'. Но все еще остается вопрос о том, стоит ли побочный эффект. Часто лучше хранить значения, которые необходимо сохранить и получить из глобальной среды, либо в списке в параметрах, либо в другой среде. – Benjamin