2016-11-22 10 views
2

インストール時に、メンテナーの連絡先情報を表示し、インストールリストでカウントする権限をユーザーに求めるRパッケージを作成したいと考えています。また、インストール直後ではなく、ユーザーが最初に関数のうちの1つを呼び出すときにコードを実行することも可能です。どちらの方法でも、このメッセージは一度しか表示されません(ユーザーがパッケージを再インストール/更新しない限り)。1回だけ実行されるコードのRパッケージ

  • 私は内部使用のためのデータセットを含める方法を知っているが、私は永久にそのデータを変更する方法がわからない:私は考えられてきた何

  • 環境変数/アプリケーション設定を設定できましたが、セッションが終了してもそれを維持する方法があるかどうかはわかりません。
  • 外部サービス/サーバーを使用すると過度に重量が重くなり、追跡したくないユーザーはメッセージを無効にすることができなくなります。

これを行うには良い方法はありますか?

+0

多くのパッケージは '.onAttach'関数で' packageStartupMessage'を使います。短いメッセージは、便利なパッケージにとって非常に合理的です。 'data.table'は例として、データキャンプのチュートリアルを宣伝します。ここの例https://github.com/Rdatatable/data.table/blob/f78d7901dc5063a5157d37db4831e418ad021fe6/R/onAttach.R –

+1

_onceと1回だけ表示するには、OPによって(妥当な)ポイントを逃してください。 –

+0

これを行うと、ユーザーのやりとりが必要なインストールで泣くようになるので、質問は*決して*表示されないようにしてください。 – Spacedman

答えて

4

これは複数回実行できますが、制限された時間枠内でのみ実行できるため、十分な可能性があります。

このコードをパッケージに追加すると、パッケージがインストールされてから7日以内にパッケージが読み込まれ、その後パッケージが更新されるまでメッセージは表示されません。

これは、インストールファイルが作成された時刻を現在の時刻と比較することによって機能します。これは、すべてのディレクトリへの書き込み権限を必要とせず、読み取りのみであるため、一般的に機能するはずです。

.onLoad <- function(libname, pkgname) { 
    ctime <- file.info(find.package(pkgname, libname))$ctime 
    if (difftime(Sys.time(), ctime, unit = "day") < 7) 
     packageStartupMessage("This msg will go away one week after installing this package") 
} 
+0

ニースは状態を保存するのを避けますが、_onceとonce_を表示するためにOPによって(妥当な)ポイントを逃します。 –

+0

いいアイデア、ありがとう!私の場合は、読者がパッケージを使用しようとしているときにのみパッケージをインストールすることを前提としているので、非常に短い時間幅を使用して繰り返すことを避けることができます。 – octern

3

あなたは一度だけそれを示すために、セッション全体で箇条書きして保存状態情報をかましなければならないことがあります。

助けるかもしれないいくつかのパッケージ:

  • settingsユーザーの構成の設定レジストリ
  • pkgconfigを提供しています設定情報
  • registryにアクセスし、構成情報
  • httrを取得
  • configを取得私的な設定を提供します。

しかし、どちらが1つ読むのかわかりませんと書いています。おそらく、最後のものがこの法案に適合します。

編集:さらに、pkgconfigはセッション間で値を保持しません。私は、ディレクトリまたはデータベースを書き込むように制御していたときに、企業のローカルコードでこの問題を解決しました。パブリックとポータブルのコードでは少し難しいです。私はまだそこにすべての主要なOSのユーザーレベルの設定を格納するパッケージがあると思うが、私は今は名前を覚えていないことができます。

編集2:私の記憶をリフレッシュするガボールCsardiにうなずきで、rappdirsは(、あまりにも他のトリックに対応するPythonライブラリのポート)、ユーザーごとの設定場所を供給移植性の問題を解決。これを単純なcvsまたはrdsファイルと組み合わせて最後にメッセージが表示されたときに保存してください。を一度にして一度だけ表示することができます。パッケージのアップグレード後にもう一度。

1

次のコードは、パッケージライブラリにファイルを作成することができます:

activate_file = paste(system.file('extdata', package = 'your_package'), 'activated.txt', sep = '/') 
file.exists(activate_file) 
# FALSE 
file.create(activate_file) 

file.exists(activate_file) 
# TRUE 

今、あなたはactivated.txtファイルが存在するかどうかを.onLoadで確認することができます。初めてメッセージを表示した後にactivated.txtを作成し、次回パッケージを使用するときにはonload関数がファイルを参照してメッセージをスキップできます。

利点:セッションを超える永続

  • ユーザーにファイルを作成するための書き込み権限があることを確実にする、プラットフォームに依存しない方法。

短所:

  • 再インストール/アップグレードは、このように再びメッセージを示す、activatedファイルを消去します。

これが受け入れられない場合は、永続的な場所を探してみることができます。これを行うためのホームドライブ(例:~/.your_package/activated.txt)。そして、このプラットフォームを独立させることが課題です。おそらくpath.expand(~)を見て、現在のユーザーのホームドライブを取得してください。これはWindowsで動作するかどうかはわかりません。

+0

しかし、そこに書き込むことはできません。それは読み取り専用でマウントすることができます。 –

+0

@DirkEddelbuettel真の場合、インストーラのホームドライブを使用するほうが良いでしょう。 –

+0

そして私はちょうど_Edit 2_を私の答えに追加しました。もちろんそれのためのパッケージがあります... –

関連する問題