Zagnieżdżony wybór środowiska funkcji
Piszę kilka funkcji do wykonywania powtarzających się zadań, ale próbuję zminimalizować ilość razy ładowania danych. Zasadniczo mam jedną funkcję, która pobiera pewne informacje i tworzy wykres. Następnie mam drugą funkcję, która zapętli i wyśle wiele wykresów do pliku .pdf. W obu funkcjach mam następujący wiersz kodu:
if(load.dat) load("myworkspace.RData")
gdzieload.dat
jest logiczne, a dane, których potrzebuję, są przechowywane w myworkspace.RData. Kiedy dzwonię do funkcji opakowującej, która przeplata i wyprowadza wiele wykresów, nie chcę przeładowywać obszaru roboczego w każdym wywołaniu funkcji wewnętrznej. Pomyślałem, że mogę po prostu załadować obszar roboczy raz w funkcji opakowania, a wtedy funkcja wewnętrzna może uzyskać dostęp do tych danych, ale otrzymałem błąd informujący inaczej.
Zrozumiałem więc, że kiedy funkcja nie może znaleźć zmiennej w swoim lokalnym środowisku (utworzonej po wywołaniu funkcji), funkcja będzie szukać zmiennej w środowisku macierzystym.
Zakładałem, że środowisko nadrzędne do wywołania funkcji wewnętrznej będzie zewnętrznym wywołaniem funkcji. Oczywiście nie jest to prawdą:
func1 <- function(...){
print(var1)
}
func2 <- function(...){
var1 <- "hello"
func1(...)
}
> func2()
Error in print(var1) : object 'var1' not found
Po przeczytaniu wielu pytań, podręcznik językowy ito naprawdę pomocny post na blogu, wymyśliłem następujące:
var1 <- "hello"
save(list="var1",file="test.RData")
rm(var1)
func3 <- function(...){
attach("test.RData")
func1(...)
detach("file:test.RData")
}
> func3()
[1] "hello"
Czy jest lepszy sposób, aby to zrobić? Dlaczego niefunc1
poszukaj niezdefiniowanych zmiennych w środowisku lokalnym utworzonym przezfunc2
, kiedy to byłofunc2
to się nazywafunc1
?
Uwaga: nie wiedziałem, jak nazwać to pytanie. Jeśli ktoś ma lepsze sugestie, zmienię go i wyedytuję.