Я пишу некоторые функции для выполнения повторяющихся задач, но я стараюсь свести к минимуму количество раз, когда я загружаю данные. В основном у меня есть одна функция, которая берет некоторую информацию и делает сюжет. Затем у меня есть вторая функция, которая будет циклически проходить и выводить несколько графиков в .pdf. В обеих функциях у меня есть следующие строки кода:Вложенные функции выбора окружения
if(load.dat) load("myworkspace.RData")
где load.dat
является логическим и данные мне нужно хранится в myworkspace.RData. Когда я вызываю функцию-обертку, которая пересекает и выводит несколько графиков, я не хочу перезагружать рабочее пространство в каждом вызове внутренней функции. Я думал, что могу просто загрузить рабочую область один раз в функцию обертки, тогда внутренняя функция могла бы получить доступ к этим данным, но я получил сообщение об ошибке в противном случае.
Так что я понял, что функция не может найти переменную в своей локальной среде (созданной при вызове функции), функция будет искать родительскую среду для переменной.
Я предположил, что родительская среда для внутреннего вызова функции будет внешним вызовом функции. Очевидно, что это не так:
func1 <- function(...){
print(var1)
}
func2 <- function(...){
var1 <- "hello"
func1(...)
}
> func2()
Error in print(var1) : object 'var1' not found
После прочтения многочисленных вопросов, язык руководство и this действительно полезный блог, я придумал следующее:
var1 <- "hello"
save(list="var1",file="test.RData")
rm(var1)
func3 <- function(...){
attach("test.RData")
func1(...)
detach("file:test.RData")
}
> func3()
[1] "hello"
Есть ли лучший способ сделать это? Почему не func1
ищет неопределенные переменные в локальной среде, созданные func2
, когда это было func2
, что называется func1
?
Примечание: Я не знал, как назвать этот вопрос. Если у кого-то есть лучшие предложения, я изменю его и отредактирую эту строку.
лексической области видимости означает, что функция будет искать неопределенные символы в своей родительской среде, которая не обязательно вызывающая среда. Проверьте это также: https://github.com/hadley/devtools/wiki/Environments –
@ Ferdinand.kraft Спасибо за ссылку. Сегодня я проработаю. – dayne
Если ваши данные в форме данных, вы можете использовать пакет 'data.table' и передать свои таблицы в качестве аргумента функции func1 внутри' func3'. Этот пакет работает по ссылке и не создает нежелательных копий ваших данных. –