有什么方法可以编辑R中的函数?
假设我们有以下功能:
foo <- function(x)
{
line1 <- x
line2 <- 0
line3 <- line1 + line2
return(line3)
}
而且我们希望将第二行更改为:
line2 <- 2
你会怎么做?
一种方法是使用
fix(foo)
并改变功能。
另一种方法是再次写入函数。
有另一种方法吗? (记住,任务是改变第二行)
我想以某种方式将函数表示为字符串的向量(以及字符),然后更改其中一个值,然后再次将其转换为函数。
或者看看调试函数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
我在一开始就说过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
。 如果您想要将更改重新分配给其他名称,则可能需要执行此操作。