What ways are there to edit a function in R?
> body(foo)[[3]] <- substitute(line2 <- 2)
> foo
function (x)
{
line1 <- x
line2 <- 2
line3 <- line1 + line2
return(line3)
}
(The "{" is body(foo)[[1]] and each line is a successive element of the list.)
Or take a look at the debugging function trace()
. It is probably not exactly what you are looking for but it lets you play around with the changes and it has the nice feature that you can always go back to your original function with untrace()
.
trace()
is part of the base
package and comes with a nice and thorough help page.
Start by calling as.list (body(foo))
to see all the lines of your code.
as.list(body(foo))
[[1]]
`{`
[[2]]
line1 <- x
[[3]]
line2 <- 0
[[4]]
line3 <- line1 + line2
[[5]]
return(line3)
Then you simply define what to add to your function and where to place it by defining the arguments in trace()
.
trace (foo, quote(line2 <- 2), at=4)
foo (2)
[1] 4
I said in the beginning that trace()
might not be exactly what you are looking for since you didn't really change your third line of code and instead simply reassigned the value to the object line2
in the following, inserted line of code. It gets clearer if you print out the code of your now traced function
body (foo)
{
line1 <- x
line2 <- 0
{
.doTrace(line2 <- 2, "step 4")
line3 <- line1 + line2
}
return(line3)
}
fix
is the best way that I know of doing this, although you can also use edit
and re-assign it:
foo <- edit(foo)
This is what fix
does internally. You might want to do this if you wanted to re-assign your changes to a different name.
fixInNamespace
is like fix
, for functions in a package (including those that haven't been exported).