2

我正在整理一个我已经工作了将近一年的包。我有一个音节查找功能所需的哈希表。哈希表实际上只是一个查找表的环境(我想我不是计算机专家)。您可以在下面看到我创建它的功能。我有一个数据集DICTIONARY(大约 20,000 个字),将在加载包时加载。我还把这个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)
}
4

1 回答 1

10

如果哈希将不经常更改(从您的问题描述来看,这似乎是这种情况),然后将哈希保存到您的包源树中

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

安装包后,env将在名称空间内可用,my_pkg:::env. 请参阅“编写 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"
}
于 2012-05-09T00:04:25.727 回答