有什么方法可以编辑R中的函数?

假设我们有以下function:

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

而我们想要改变第二行是:

  line2 <- 2 

你会怎么做?

一种方法是使用

 fix(foo) 

并改变function。

另一种方法是再次写入函数。

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

我想用某种方式来表示函数作为一个string(以及字符)的向量,然后改变它的一个值,然后再把它变成一个函数。

或者查看一下debugging函数trace() 。 这可能不是你正在寻找的东西,但它可以让你玩弄变化,它有很好的function,你总是可以回到你的原始函数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 

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

 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一个包中的函数(包括那些还未被导出的函数)。

您可以使用“ 身体 ”function。 这个函数将返回函数的主体:

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