2012-04-30 2 views
4

Rでパッケージを開発しています。mypkgとしましょう。パッケージを開発する際に以前のバージョンの関数を削除するR

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

ここでは典型的なワークフローを示します。

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

Rで

  1. スタートに新しいRインスタンス
  2. を[私は避けたい次の3つのステップ]:R下

実行を期待通りにlibrary(mypkg)

  • myfunction()作品.2.14.1。

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

  • 答えて

    4

    パッケージをアンロードしてから取り外す必要があります。 ?detachがあります

    パッケージは、名前空間を持っている場合、それがデフォルト で名前空間をアンロードしない(とさえ「= TRUEアンロード」でない場合もある)、および 着脱ん離脱するわけではない一般的なアンロードに任意の動的にロードされました コンパイル済みコード(DLL)。さらに、 の登録S3メソッドは削除されません。ネームスペースがロードされているパッケージ に 'library'を使用すると、すでに ロードされたネームスペースのエクスポートがアタッチされます。したがって、パッケージの取り外しや再取り付けでは、パッケージの一部またはすべてのコンポーネントがリフレッシュされない場合があり、お勧めできません。

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

    試してください:「パッケージには、名前空間を持っている場合は、」これはR 2.14に変更されたようになりましたすべてのパッケージを意味していること

    detach(package:mypkg, unload = TRUE) 
    

    注意。0(IIRCバージョン番号)

    あなたが変更されているコードはRコードの場合は、mypkgの名前空間にあなたのグローバルワークスペース(mypkg関数のすなわち新しいバージョン)内のオブジェクト/機能を割り当てることがassignInNamespace()を使用することを検討してください。例えば、我々はmypkgに機能foo()を持っていると、ローカル我々はfoo()の新しいバージョンであるnewfoo()があります。変更はCコードに関連する、または上記が動作しない場合

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

    を、そしておそらくあなたは従うべきですR Coreのアドバイスをして、パッケージをデタッチしようとする代わりに新しいRインスタンスを生成します。 Emacsを話す場合

    も参照してくださいハドレーウィッカムとのEmacs + ESSのデベロッパーツールパッケージは、(新しいRインスタンスなどを産卵)開発プロセスを容易にすることがあります。

    +0

    'detach(パッケージ:mypkg、unload = TRUE)'もちろん、完全に動作します。私はこれらの新しい名前空間のことについて学ぶことを避けてきました。私はもうそれを避けることができるかのように見える。 – digitalmaps

    関連する問題