次の機能があるとしましょう:
foo <- function(x)
{
line1 <- x
line2 <- 0
line3 <- line1 + line2
return(line3)
}
そして、2行目を次のように変更します。
line2 <- 2
どうしますか?
一つの方法は
fix(foo)
そして、機能を変更します。
もう1つの方法は、関数を再度作成することです。
別の方法はありますか? (タスクは2行目のみを変更することでした)
私が望むのは、何らかの方法で関数を文字列(まあ、文字)のベクトルとして表現し、その値の1つを変更してから、再び関数に変換することです。
または、デバッグ関数trace()
を見てください。おそらくあなたが探しているものではありませんが、変更をいじることができ、untrace()
で元の関数にいつでも戻ることができる素晴らしい機能があります。 trace()
はbase
パッケージの一部であり、すてきで徹底的なヘルプページが付属しています。
as.list (body(foo))
を呼び出して、コードのすべての行を表示します。
_as.list(body(foo))
[[1]]
`{`
[[2]]
line1 <- x
[[3]]
line2 <- 0
[[4]]
line3 <- line1 + line2
[[5]]
return(line3)
_
次に、trace()
の引数を定義して、関数に追加するものと配置する場所を定義します。
_trace (foo, quote(line2 <- 2), at=4)
foo (2)
[1] 4
_
最初に言ったのは、3行目のコードを実際には変更せず、代わりにオブジェクトの_line2
_に値を再割り当てしただけなので、trace()
は必ずしも探しているものではないかもしれない次に、挿入されたコード行。現在トレースされている関数のコードを印刷すると、より明確になります
_body (foo)
{
line1 <- x
line2 <- 0
{
.doTrace(line2 <- 2, "step 4")
line3 <- line1 + line2
}
return(line3)
}
_
> body(foo)[[3]] <- substitute(line2 <- 2)
> foo
function (x)
{
line1 <- x
line2 <- 2
line3 <- line1 + line2
return(line3)
}
(「{」はbody(foo)[[1]]であり、各行はリストの連続した要素です。)
fix
は、これを行うのに知っている最良の方法ですが、edit
を使用して再割り当てすることもできます。
foo <- edit(foo)
これは、fix
が内部的に行うことです。変更を別の名前に再割り当てする場合、これを行うことができます。
fixInNamespace
は、パッケージ内の関数(エクスポートされていない関数を含む)のfix
に似ています。
「body」関数を使用できます。この関数は、関数の本体を返します。
fnx = function(a, b) { return(a^2 + 7*a + 9)}
body(fnx)
# returns the body of the function
したがって、関数を「編集」する良い方法は、代入文の左側で「body」を使用することです。
body(fnx) = expression({a^2 + 11*a + 4})