2012-11-14 87 views
1

我最近寫了一個R擴展。這些函數使用包中包含的數據,因此必須加載它們。子例程也需要訪問數據。僱用環境來處理包函數中的包數據

這是採取的方法:

main<- function(...){ 
    data(data) 
    sub <- function(...,data=data){...} 
... 
} 

我不滿意的是,數據駐留在.GlobalEnv事實所以它仍然徘徊在功能已經終止(也破壞了通過論證概念downpassing)。

請把我放在正確的軌道上!當你必須處理包函數中的包數據時,你如何使用環境?

+0

@Paul,感謝您的編輯。你明確表示,我很不清楚自己想要什麼。希望這更明確一些。 – Janhoo

回答

3

看起來你正在尋找的LazyData指令在namepace:

LazyData: yes 

Othewise,dataenvir參數,你可以使用你想要的環境控制來加載數據,以便例如如果你想要的數據裏面main被加載,你可以使用:

main<- function(...){ 
    data(data, envir = environment()) 
    sub <- function(...,data=data){...} 
    ... 
} 
+0

確實如此,但不是'data',那麼'environment'就駐留在'.GlobalEnv'中。沒有辦法用'data()'或'load()'將數據加載到'parent = emptyenv()'的環境中。但無論如何,您提出的解決方案是如何使數據成爲可接受/可預見的方法?謝謝羅馬。 – Janhoo

+0

我無法重現您描述的行爲。沒有任何東西駐留在'.GlobalEnv'上。也許這就是你正在尋找的數據'data(data,envir = new.env(parent = emptyenv()))' –

+0

YES !!,那就是我一直在尋找的東西。非常感謝你。 – Janhoo

3

如果需要針對你的函數中的數據,而不是包的用戶,它應該是SAV編輯在位於R目錄中的名爲sysdata.rda的文件中。

從r擴展:

有兩個例外:如果R子目錄包含一個文件 sysdata.rda(R對象保存的圖像:請使用適合 通過壓縮工具的建議:: resaveRdaFiles )這將是 延遲加載到命名空間/軟件包環境中 - 對於不打算通過 數據可供用戶訪問的系統數據集,此數據集旨在爲 。

+0

這也是很好的知道,並可能在未來的項目中派上用場。謝謝。在這裏,我只是想從我的包裝中獲得我的功能,只是爲了在發現它時留下環境。但由於'data()'按默認寫入'envir = .GlobalEnv'的本質,它不會。 'data(data,envir = environment())'做了這個工作 – Janhoo

+0

找了這個信息花了很長時間。 – jzadra