4

私はRでパッケージを開発しています。それを呼びましょうmypkg

一部の関数はパッケージから実行すると動作が異なるため(理由はわかりませんが、これは問題ではありません)、パッケージ内の関数を編集してから、コマンドラインからパッケージを再構築しています。何らかの理由で、特定のRインスタンスは、ソースが変更され、パッケージが再構築および再インストールされた場合でも、古いバージョンの関数を保持します。変更を確認するには、新しいインスタンスを開始する必要があります。

これが典型的なワークフローです。

  1. に変更をmyfunction()加えるmypkg.R
  2. Rの場合: detach(package:mypkg); remove.packages("mypkg")
  3. コマンドライン:R CMD INSTALL --build c:\mypkg
  4. デフォルトのライブラリにインストールされたことを通知します
  5. Rの場合:library(mypkg)
  6. Rの場合:myfunction()変更前に以前のバージョンを実行します。

[避けたい次の3つのステップ]

  1. 新しいRインスタンスを開始します
  2. Rの場合:library(mypkg)
  3. myfunction()期待どおりに動作します

R.2.14.1で実行します。

新しいRインスタンスの開始を回避するために、このワークフローを改善する方法の提案を探しています。

4

1 に答える 1

4

パッケージのアンロードとデタッチを試みる必要があります。?detachもっている:

パッケージに名前空間がある場合、デタッチしてもデフォルトでは名前空間がアンロードされません ('unload=TRUE' を指定してもアンロードされない場合があります)。さらに、名前空間から登録された S3 メソッドは削除されません。名前空間がロードされているパッケージで「library」を使用すると、すでにロードされている名前空間のエクスポートが添付されます。そのため、パッケージをデタッチして再アタッチすると、パッケージの一部またはすべてのコンポーネントが更新されない可能性があるため、お勧めできません。

特に最後の文に注意してください。

試す:

detach(package:mypkg, unload = TRUE)

「パッケージに名前空間がある場合」は、R 2.14.0 (IIRC バージョン番号) で変更されたため、すべてのパッケージを意味することに注意してください。

変更するコードが R コードの場合、 を使用assignInNamespace()して、グローバル ワークスペース内のオブジェクト/関数 (つまり、 内の関数の新しいバージョンmypkg) を の名前空間に割り当てることを検討してくださいmypkg。たとえば、 に関数foo()mypkgあり、ローカルにnewfoo()は の新しいバージョンがありfoo()ます。

assignInNamespace("foo", newfoo, "mypkg")

変更が C コードに関連する場合、または上記が機能しない場合は、R コアのアドバイスに従い、パッケージをデタッチする代わりに新しい R インスタンスを生成する必要があります。

Hadley Wickham のdevtoolsパッケージと Emacs+ESSも参照してください。Emacs を話せば、開発プロセス (新しい R インスタンスの生成など) が容易になる可能性があります。

于 2012-04-30T15:16:49.527 に答える