2

私は、ほぼ1年前から取り組んできたパッケージをまとめる過程にあります。音節検索関数に必要なハッシュテーブルと呼ばれるものがあります。ハッシュテーブルは、実際にはルックアップテーブルである単なる環境です(私はコンピューターの専門家ではないと思います)。私が作成した関数を以下に示します。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 に答える