たとえば、パッケージの機能を置き換えるとしますknitr:::sub_ext
。(注:それが内部:::
関数である場合、つまり ではなくによってのみアクセスできる場合に特に興味があります::
が、同じ答えが両方で機能する可能性があります)。
library(knitr)
my.sub_ext <- function (x, ext) {
return("I'm in your package stealing your functions D:")
}
# replace knitr:::sub_ext with my.sub_ext
knitr <- asNamespace('knitr')
unlockBinding('sub_ext', knitr)
assign('sub_ext', my.sub_ext, knitr)
lockBinding('sub_ext', knitr)
質問:これを行った後にオリジナルを取得する方法はありますか? knitr:::sub_ext
できればパッケージをリロードせずに?
(なぜ私がこれをやりたいのか知りたい人がいることを知っているので、ここにあります。質問を読む必要はありません)。私はパッケージ内のいくつかの機能にパッチを当ててきました(実際にはsub_ext
機能ではありません...):
original.sub_ext <- knitr:::sub_ext
new.sub_ext <- function (x, ext) {
# some extra code that does something first, e.g.
x <- do.something.with(x)
# now call the original knitr:::sub_ext
original.sub_ext(x, ext)
}
# now set knitr:::sub_ext to new.sub_ext like before.
これは一般的には良い考えではないことに同意します (ほとんどの場合、これらは変更が CRAN に反映されるまでの迅速な修正であるか、または多少ケース固有であるため決して承認されない「機能要求」です)。
上記の問題は、誤って 2 回実行した場合 (たとえば、その間に R を再起動せずに 2 回実行したスクリプトの先頭にある場合)、2 回目original.sub_ext
は実際ではnew.sub_ext
なく前の knitr:::sub_ext
ものであるため、無限になります。再帰。
sub_ext
は内部関数であるため(直接呼び出すことはしませんが、knitr の関数はknit
すべて内部的に呼び出します)、呼び出すすべての関数を手動でsub_ext
呼び出すように変更することは期待できません。new.sub_ext
パッケージの名前空間。