7

インストールプロセス中にインターネットからデータセットをダウンロードし、それを使用してパッケージをロードするときに使用できるように準備して保存するパッケージを知っている人はいますlibrary(packageName)か? このアプローチには欠点がありますか (データ ソースが利用できない場合やデータ形式が変更された場合にパッケージのインストールが失敗するという明白な欠点以外に)?

編集:いくつかの背景。データは ZIP アーカイブ内の 3 つのタブで区切られたファイルであり、連邦統計局が所有し、一般に自由にアクセスできます。データをダウンロード、抽出、準備するRコードがあります。最終的に、.RDataフォーマットで保存できる3つのデータフレームが作成されます。

データを提供する「データ」パッケージと、それを操作する「コード」パッケージの 2 つのパッケージを作成することを考えています。

4

2 に答える 2

3

あなたがあなたの編集を投稿している間、私は以前にこのモックアップをしました. うまくいくと思いますが、テストしていません。何を変更する必要があるかを確認できるようにコメントしました。ここでの考え方は、期待されるオブジェクトが現在の作業環境で利用可能かどうかを確認することです。そうでない場合は、データが存在するファイルが現在の作業ディレクトリにあることを確認してください。それが見つからない場合は、ユーザーにファイルをダウンロードするように促し、そこから続行します。

myFunction <- function(this, that, dataset) {

  # We're giving the user a chance to specify the dataset.
  #   Maybe they have already downloaded it and saved it.
  if (is.null(dataset)) {

    # Check to see if the object is already in the workspace.
    # If it is not, check to see whether the .RData file that
    #   contains the object is in the current working directory.
    if (!exists("OBJECTNAME", where = 1)) {
      if (isTRUE(list.files(
        pattern = "^DATAFILE.RData$") == "DATAFILE.RData")) {
        load("DATAFILE.RData")

        # If neither of those are successful, prompt the user
        #   to download the dataset.
      } else {
        ans = readline(
          "DATAFILE.RData dataset not found in working directory.
          OBJECTNAME object not found in workspace. \n
          Download and load the dataset now? (y/n) ")
        if (ans != "y")
          return(invisible())

        # I usually use RCurl in case the URL is https
        require(RCurl)
        baseURL = c("http://some/base/url/")

        # Here, we actually download the data
        temp = getBinaryURL(paste0(baseURL, "DATAFILE.RData"))

        # Here we load the data
        load(rawConnection(temp), envir=.GlobalEnv)
        message("OBJECTNAME data downloaded from \n",
                paste0(baseURL, "DATAFILE.RData \n"), 
                "and added to your workspace\n\n")
        rm(temp, baseURL)
      }
    }
    dataset <- OBJECTNAME
  }
  TEMP <- dataset
  ## Other fun stuff with TEMP, this, and that.
}

Github でホストされている 2 つのパッケージ

これは、@juba と I の間のコメントに基づく別のアプローチです。基本的な概念は、あなたが説明したように、コード用に 1 つのパッケージとデータ用に 1 つのパッケージを用意することです。この関数は、コードを含むパッケージの一部になります。そうなる:

  1. データ パッケージがインストールされているかどうかを確認する
  2. インストールしたデータ パッケージのバージョンが Github のバージョンと一致するかどうかを確認します。Github が最新バージョンであると仮定します。

いずれかのチェックに失敗すると、パッケージのインストールを更新するかどうかをユーザーに尋ねます。この場合、デモンストレーションのために、Github で進行中のパッケージの 1 つにリンクしました。これにより、パッケージをホストした後、独自のパッケージで動作させるために何を置き換える必要があるかがわかります。

CheckVersionFirst <- function() {
  # Check to see if installed
  if (!"StataDCTutils" %in% installed.packages()[, 1]) {
    Checks <- "Failed"
  } else {
    # Compare version numbers
    require(RCurl)
    temp <- getURL("https://raw.github.com/mrdwab/StataDCTutils/master/DESCRIPTION")
    CurrentVersion <- gsub("^\\s|\\s$", "", 
                           gsub(".*Version:(.*)\\nDate.*", "\\1", temp))
    if (packageVersion("StataDCTutils") == CurrentVersion) {
      Checks <- "Passed"
    }
    if (packageVersion("StataDCTutils") < CurrentVersion) {
      Checks <- "Failed"
    }
  }

  switch(
    Checks,
    Passed = { message("Everything looks OK! Proceeding!") },
    Failed = {
      ans = readline(
        "'StataDCTutils is either outdated or not installed. Update now? (y/n) ")
      if (ans != "y")
        return(invisible())
      require(devtools)
      install_github("StataDCTutils", "mrdwab")
    })
# Some cool things you want to do after you are sure the data is there
}

で試してみてくださいCheckVersionFirst()

: これは、データの新しいバージョンを Github にプッシュするたびに、説明ファイルのバージョン番号を更新することを宗教的に覚えている場合にのみ成功します!

したがって、明確化/要約/拡張するために、基本的な考え方は次のとおりです。

  • データパッケージの更新されたバージョンを定期的に Github にプッシュします。その際、ファイル内のデータパッケージのバージョン番号を必ず変更してください。DESCRIPTION
  • CheckVersionFirst()この関数を.onLoadイベントとしてコードパッケージに統合します。(明らかに、アカウントとパッケージ名に一致するように関数を変更します)。
  • コメント行を変更して、# Some cool things you want to do after you are sure the data is there実際にやりたいクールなことを反映させます。これは、おそらくlibrary(YOURDATAPACKAGE)データをロードするために始まります....
于 2013-02-14T10:40:39.840 に答える
1

この方法は効率的ではないかもしれませんが、良い回避策です。定期的に更新されるデータが必要なパッケージを作成する場合は、まずそのデータを含むパッケージを作成します。関数は必要ありませんが、セッター (この場合は必要ないかもしれません) とゲッターの概念が気に入っています。

次に、パッケージを作成するときに、「データ」パッケージを依存関係として持ちます。このようにして、誰かがあなたのパッケージをインストールするたびに、常に最新のデータを入手できます。

あなたの側では、「データ」パッケージ内のデータを交換して、必要なリポジトリにアップロードするだけです。

パッケージのビルド方法がわからない場合は、 と を確認?packages.skeletonしてくださいR CMD CHECKR CMD BUILD

于 2013-02-14T10:03:29.767 に答える