有什么方法可以编辑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})