2012-05-08 74 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

相关问题