我正在整理一个我已经工作了近一年的包裹.我有一个我称之为音节查找功能所需的哈希表.哈希表实际上只是一个查找表的环境(我想我不是计算机专家).您可以在下面看到我创建它的功能.我有一个数据集DICTIONARY(约20,000字),将在加载包时加载.我还要将这个DICTIONARY传递给hash函数以在加载包时创建一个新环境; 像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)
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
你们中的许多人可能会想"这取决于用户是否想要加载环境".有效点,但此包的目标受众是识字领域的人.在该领域中R用户并不多,所以我必须尽可能简单地使用它.只是想了解我为什么要这样做的理念,以便它不会成为争论的焦点.
先感谢您.(PS我看过这本手册(LINK)但似乎无法找到关于这个主题的任何信息)
编辑:根据安德烈的建议,我认为这将是这样的?但我不确定.这是否在包加载中的所有其他函数和数据集之后加载?这个东西对我来说有点混乱.
.onLoad <- function(){
env <- hash(DICTIONARY)
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*gan 10
如果哈希值不经常更改(从您的问题描述中看起来就是这种情况),那么将哈希值保存到包源代码树中
save(env, file="<my_pkg>/R/sysdata.rda")
Run Code Online (Sandbox Code Playgroud)
安装包后,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
})
Run Code Online (Sandbox Code Playgroud)
解决的可能性.onLoad是每次加载包时数据都会改变,例如,因为它正在从某个在线源检索更新.
env <- new.env(parent=emptyenv())
.onLoad <- function(libname, pkgname)
{
## fill up env
env[["foo"]] = "bar"
}
Run Code Online (Sandbox Code Playgroud)