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