パッケージのtidy.source
機能を上書きしようとしています。knitr
問題は、パッケージによってインポートされるパッケージでtidy.source
定義されていることです。私が実行した場合:formatR
knitr
get("tidy.source", envir=asNamespace("knitr"))
元のコードを取得します。だから私はオーバーライドtidy.source
したくなります:
assignInNamespace ("tidy.source", function()print("My tidy.source"), "knitr")
、
しかし、私は得る:
Error in bindingIsLocked(x, ns) : no binding for "tidy.source"
。
実際tidy.source
、で定義されformatR
、によって継承されknitr
ます。と:
assignInNamespace ("tidy.source", function()print("My tidy.source"), "formatR")
すべてが明らかにスムーズですが、もう一度確認するget("tidy.source", envir=asNamespace("knitr"))
と、内部にはknitr
何も変更されていないことがわかります。
何か助けはありますか?
編集:
この質問は、 knitr / formatRの新しい開発リリースにより、部分的に廃止されました。この議論に気づき、彼のパッケージを更新することを決定してくれたYihuiに感謝します。見る:
https://github.com/yihui/formatR/commit/6f70360f359caa8d2bb33190a1c89530defb0e98
私は間違いなくSweaveからknitrに切り替えることができます。
インポートされたパッケージ関数のオーバーライドに関する一般的な質問は、とにかく未解決のままです。knitr / formatRパッケージとは関係がなくなったので、より一般的な言葉で言い換えます。
パッケージimpをインポートするパッケージメインがあるとします。前者をロードすると、添付パッケージとその両方のリストにが表示され、ロードされた名前空間の名前の中に表示されます。"package:main"
"main"
"sub"
mainがエクスポートされたサブ関数expfuncをインポートすると仮定します。これにより、エクスポートされていないサブ関数prvfuncが順番に呼び出されます。expfunc.modを使用してexpfuncを変更/カスタマイズする場合は、次を使用することを検討してください。
assign("exp.sub.func", exp.sub.func.mod, asNamespace ("sub"))
その結果、実行することにより、sub::exp.sub.func
パッチが適用されたバージョン(つまり、exp func.mod)を取得します。
残念ながら、expfunc.modがprvfuncに依存し続ける限り、エラーが発生します。
Error in [...] : object 'prv.sub.func' not found
実際には:
environment(sub::exp.sub.func)
今すぐ戻ります:パッチを適用する前でした<environment: R_GlobalEnv>
。<environment: namespace:sub>
問題は、パッチを適用した関数を適切な名前空間に移動する方法です。
上記の問題を実装するには、もちろんどのパッケージでも使用できます。私の場合、メインおよびインポートされた名前空間としてknitrとformatRを使用し、パッチを適用した関数としてtidy.source()を使用しました。