在R中编辑函数有哪些方法?

Tal*_*ili 47 r editing function

假设我们有以下功能:

foo <- function(x)
{
    line1 <- x
    line2 <- 0
    line3 <- line1 + line2
    return(line3)
}
Run Code Online (Sandbox Code Playgroud)

我们想要改变第二行:

    line2 <- 2
Run Code Online (Sandbox Code Playgroud)

你会怎么做?

一种方法是使用

fix(foo)
Run Code Online (Sandbox Code Playgroud)

并改变功能.

另一种方法是再次编写该函数.

还有另外一种方法吗?(记住,任务是改变第二行)

我想要的是某种方式将函数表示为字符串向量(好吧,字符),然后更改其中一个值,然后再将其转换为函数.

42-*_*42- 37

> body(foo)[[3]] <- substitute(line2 <- 2)
> foo
function (x) 
{
    line1 <- x
    line2 <- 2
    line3 <- line1 + line2
    return(line3)
}
Run Code Online (Sandbox Code Playgroud)

("{"是body(foo)[[1]],每行是列表的连续元素.)

  • 最近我被迫做了类似的事情,有一件事可以改进:你可以深入到列表中,所以对于问题案例`body(foo)[[3]] [[3]] < - 2`起作用和`替换`是不必要的. (7认同)
  • 如果你更换整条生产线,则需要.通常:类应匹配:我的工作方式因为我用数字替换数字.如果我想将`line2`替换为`myVariable`,则需要`as.symbol`转换. (2认同)

mro*_*opa 24

或者看看调试功能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)
Run Code Online (Sandbox Code Playgroud)

然后,您只需通过定义参数来定义要添加到函数中的内容以及放置它的位置trace().

trace (foo, quote(line2 <- 2), at=4)
foo (2)
[1] 4
Run Code Online (Sandbox Code Playgroud)

我在开始时说过,这trace()可能不是你想要的,因为你并没有真正改变你的第三行代码,只是简单地将值重新分配给line2下面插入的代码行中的对象.如果您打印出现在跟踪的函数的代码,它会变得更清晰

body (foo)
{
    line1 <- x
    line2 <- 0
    {
        .doTrace(line2 <- 2, "step 4")
        line3 <- line1 + line2
    }
    return(line3)
}
Run Code Online (Sandbox Code Playgroud)


Sha*_*ane 20

fix虽然您也可以使用edit并重新分配它,但我知道这样做是最好的方式:

foo <- edit(foo)
Run Code Online (Sandbox Code Playgroud)

这是fix内部的.如果要将更改重新分配给其他名称,可能需要执行此操作.


Ric*_*ton 15

fixInNamespace就像fix包中的函数(包括那些尚未导出的函数)一样.


dou*_*oug 8

您可以使用' body '功能.这个函数将返回函数体:

fnx = function(a, b) { return(a^2 + 7*a + 9)}
body(fnx)
# returns the body of the function
Run Code Online (Sandbox Code Playgroud)

因此,"编辑"函数的一种好方法是在赋值语句的左侧使用"body":

body(fnx) = expression({a^2 + 11*a + 4})
Run Code Online (Sandbox Code Playgroud)