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

在R中编辑函数有哪些方法?,r,function,editing,R,Function,Editing,假设我们有以下功能: foo <- function(x) { line1 <- x line2 <- 0 line3 <- line1 + line2 return(line3) } fnx = function(a, b) { return(a^2 + 7*a + 9)} body(fnx) # returns the body of the function 并改变功能 另一种方法是重新编写函数 还有别的办法吗?(记住,任务只是改

假设我们有以下功能:

foo <- function(x)
{
    line1 <- x
    line2 <- 0
    line3 <- line1 + line2
    return(line3)
}
fnx = function(a, b) { return(a^2 + 7*a + 9)}
body(fnx)
# returns the body of the function
并改变功能

另一种方法是重新编写函数

还有别的办法吗?(记住,任务只是改变第二行)


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

fix
是我所知道的最好的方法,尽管您也可以使用
编辑
并重新分配它:

foo <- edit(foo)

foo您可以使用“body”功能。此函数将返回函数体:

foo <- function(x)
{
    line1 <- x
    line2 <- 0
    line3 <- line1 + line2
    return(line3)
}
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})

或者查看调试函数
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()
可能不是您想要的,因为您并没有真正更改第三行代码,而是在下面插入的代码行中将值重新分配给对象
line2
。如果您打印出现在跟踪的函数的代码,它会变得更清晰

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

line1
>body(foo)[[3]]
fixInNamespace
类似于
fix
,用于包中的函数(包括尚未导出的函数).

而这不是通过将参数传递给函数来实现的。请注意,您也可以将函数作为参数传递。嗨,Leo-问题是我何时想更改其他人所做的函数,但在代码中不必复制粘贴整个函数。如果您需要编辑“内部”函数中,我发现以下建议和代码片段非常有用:最近我被迫做了类似的事情,有一件事可以改进:您可以更深入地查看列表,因此对于疑问句
body(foo)[[3][[3]]谢谢。我认为需要替换以保持表达式作为语言项的模式。如果替换整行,则需要是。通常:类应匹配:我的工作方式,因为我用数字替换数字。如果我要替换,例如,
line2
myVariable
,则需要
as.symbol
转换。I记得昨天在回答关于如何构建矩生成函数的问题时使用的这种方法。它只需要使用substitute对
*exp(x*t)
进行符号化的“追加”,其中参数作为
quote()
-ed调用对象传递。这实际上是
主体的用法
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)
}