web-dev-qa-db-ja.com

Rで関数を編集する方法は何ですか?

次の機能があるとしましょう:

foo <- function(x)
{
    line1 <- x
    line2 <- 0
    line3 <- line1 + line2
    return(line3)
}

そして、2行目を次のように変更します。

    line2 <- 2

どうしますか?

一つの方法は

fix(foo)

そして、機能を変更します。

もう1つの方法は、関数を再度作成することです。

別の方法はありますか? (タスクは2行目のみを変更することでした)

私が望むのは、何らかの方法で関数を文字列(まあ、文字)のベクトルとして表現し、その値の1つを変更してから、再び関数に変換することです。

46
Tal Galili

または、デバッグ関数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)
}
_
24
mropa
> body(foo)[[3]] <- substitute(line2 <- 2)
> foo
function (x) 
{
    line1 <- x
    line2 <- 2
    line3 <- line1 + line2
    return(line3)
}

(「{」はbody(foo)[[1]]であり、各行はリストの連続した要素です。)

36
42-

fixは、これを行うのに知っている最良の方法ですが、editを使用して再割り当てすることもできます。

foo <- edit(foo)

これは、fixが内部的に行うことです。変更を別の名前に再割り当てする場合、これを行うことができます。

20
Shane

fixInNamespaceは、パッケージ内の関数(エクスポートされていない関数を含む)のfixに似ています。

15
Richie Cotton

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})
8
doug