2012-05-08 75 views
2

我正在整理一個我一直在努力工作了近一年的程序包。我有我稱之爲音節查找函數需要的哈希表。散列表實際上只是一個環境(我認爲我不是電腦專家),這是一個查找表。你可以在下面看到我創建它的功能。我有一個數據集DICTIONARY(約20000字),將在加載包時加載。我也將這個DICTIONARY傳遞給哈希函數來創建一個新的環境,當包被加載時;就像env <- hash(DICTIONARY)一樣htis是我現在加載環境的方式。如何在加載包時啓動一個函數,以便爲使用我的包創建這個新環境?在包中包含一個「哈希表」

hash <- function(x, type = "character") { 
    e <- new.env(hash = TRUE, size = nrow(x), parent = emptyenv()) 
    char <- function(col) assign(col[1], as.character(col[2]), envir = e) 
    num <- function(col) assign(col[1], as.numeric(col[2]), envir = e) 
    FUN <- if(type=="character") char else num 
    apply(x, 1, FUN) 
    return(e) 
} 

#currently how I load the environment with the DICTIONARY lookup table 
env <- hash(DICTIONARY) 

這裏是DICTIONARY頭,如果它是有幫助的:

word syllables 
1  hm   1 
2 hmm   1 
3 hmmm   1 
4 hmph   1 
5 mmhmm   2 
6 mmhm   2 
7  mm   1 
8 mmm   1 
9 mmmm   1 
10 pff   1 

很多人可能會想:「這是由用戶來決定是否要加載的環境」。有效的點,但這個包的目標受衆是識字領域的人。在這個領域沒有太多的R用戶,所以我必須儘可能簡單地使用這個東西。只是想擺脫爲什麼我想要這樣做的哲學,在那裏,這樣它就不會成爲爭論的焦點。

預先感謝您。 (PS我已經看了本手冊(LINK),但似乎無法找到關於此主題的任何信息)

編輯: 每安德烈的建議,我認爲它會是這樣的?但我不確定。這是否會在包加載中的所有其他函數和數據集之後加載?這東西有點讓我困惑。

.onLoad <- function(){ 
    env <- hash(DICTIONARY) 
} 
+0

你看過這裏列出的參考資料嗎? http://stackoverflow.com/a/7297741/602276 – Andrie

+0

不,我沒有感謝參考。 –

+2

我認爲你正在尋找'?.onLoad' – Andrie

回答

10

如果散列是要經常改變(這似乎等的情況下,從您的問題描述),然後保存散列到您的軟件包源樹

save(env, file="<my_pkg>/R/sysdata.rda") 

安裝包後,env將在名稱空間0123'內提供。請參見「編寫R擴展」的第1.1.3節。您可能有一個腳本,比如在「/inst/scripts/make_env.R」中創建env,並且您作爲開發人員在極少情況下需要更新env

另一種可能性是哈希值發生變化,但僅在包上安裝。然後解決方案是編寫在軟件包安裝時評估的代碼。因此,在一個文件/R/env.R寫沿

env <- local({ 
    localenv <- new.env(parent=emptyenv()) 
    ## fill up localenv, then return it 
    localenv[["foo"]] = "bar" 
    localenv 
}) 

通過.onLoad解決的可能性是,每個數據包被加載,如時間改變線的東西,因爲它是從一些檢索更新在線來源。

env <- new.env(parent=emptyenv()) 

.onLoad <- function(libname, pkgname) 
{ 
    ## fill up env 
    env[["foo"]] = "bar" 
} 
+0

我認爲這就是要走的路(第一個,然後我會一起消除包中的散列函數,很好! –

+0

+1 Nice answer ... – Andrie

相關問題