53

次の関数があるとします。

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

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

    line2 <- 2

どうやってそれをしますか?

1つの方法は、使用することです

fix(foo)

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

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

別の方法はありますか?(覚えておいてください、タスクは 2 行目だけを変更することでした)

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

4

5 に答える 5

43

body<-関数の新しいコンテンツを割り当てることができる関数があります。

body(foo)[[3]] <- substitute(line2 <- 2)
foo
#-----------    
function (x) 
{
    line1 <- x
    line2 <- 2
    line3 <- line1 + line2
    return(line3)
}

(「{」はbody(foo)[[1]]であり、各行はリストの連続する要素です。したがって、2行目は式リストの3番目の要素です。挿入される要素は、テキストではなく未評価の式である必要があります。 。)

formals<-引数ペアリストに対して同様の手術を実行できる対応する関数もあります。

注:関数がロードされたパッケージ内のアクセサリ機能リソースを呼び出す場合fixInNamespaceよりも、おそらくより適切な選択です。fixコンソールから使用すると、両方fixが結果をに割り当てます.GlobalEnv

于 2010-03-21T02:00:30.083 に答える
27

または、デバッグ機能を見てください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行目を実際に変更せず、代わりに次の挿入されたコード行のtrace()オブジェクトに値を再割り当てしただけなので、探しているものとは正確に一致しない可能性があるということです。line2トレースされた関数のコードを印刷すると、より明確になります

body (foo)
{
    line1 <- x
    line2 <- 0
    {
        .doTrace(line2 <- 2, "step 4")
        line3 <- line1 + line2
    }
    return(line3)
}
于 2010-03-16T21:43:08.323 に答える
23

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

foo <- edit(foo)

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

于 2010-03-16T21:12:00.487 に答える
17

fixInNamespacefix、パッケージ内の関数 (エクスポートされていないものを含む) のようなものです。

于 2010-06-07T10:19:01.890 に答える
9

' 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})
于 2010-03-16T21:40:09.647 に答える