我正在編寫一些用於執行重複任務的函數,但我試圖最小化加載數據的次數。基本上我有一個函數需要一些信息並繪製一個圖表。然後我有第二個函數將循環並輸出多個圖.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'包,並將你的表作爲參數傳遞給'func3'裏面的'func1'。此軟件包僅供參考,不會產生您的數據不需要的副本。 –