2010-06-04 51 views
7

我有一些.rdata文件,其中包含由approxfun()定义的已保存函数。修改现有函数对象的正文文本

一些保存文件前从最新包“基地” approxfun为“统计”的变化,所以身体有

PACKAGE = "base" 

和错误的包会导致功能失效。我可以修复(myfun),只需将“base”替换为“stats”,但我想要一个整洁的自动方式。

我可以用gsub()和body()以某种方式做到这一点吗?

我能得到身体的文本和替代那里

as.character(body(myfun)) 

,但我不知道如何把这一回“呼叫”并替换定义。

(我知道一个更好的解决方案是保存最初由approxfun,只需重新创建函数的数据,但我不知道是否有修改现有的一个明智的方式。)

编辑:我发现在这里

What ways are there to edit a function in R?

+0

可能重复http://stackoverflow.com/questions/2458013/what-ways-are-to-edit-a-function-in-r) – 2014-05-11 19:09:27

+0

我试过'body(foo)< - gsub(“PACKAGE ='base'”,“PACKAGE ='stats'” ,body(foo))',但body()不会返回文本,因此您不能使用文本操作来更改它。我通过@MrFlick – 2014-08-05 15:44:51

+2

验证了这一点,然后你可以自己写答案,以便这篇文章不再是“未答复”的? – 2014-09-05 07:57:20

回答

3

使用substitute功能。

例如:

myfun <- function(x,y) { 
    result <- list(x+y,x*y) 
    return(result) 
} 

使用body,治疗myfun作为一个列表来选择你想在功能改变什么:

> body(myfun)[[2]][[3]][[2]] 
x + y 

当你改变这一点,你必须使用substitute函数,以便根据需要用callname对象替换该函数的部分。用字符串替换不起作用,因为函数不是以字符串的形式存储或操作的。

body(myfun)[[2]][[3]][[2]] <- substitute(2*x) 

现在的功能选择的那一段已经被替换:

> myfun 
function (x, y) 
{ 
    result <- list(2 * x, x * y) 
    return(result) 
} 
的[?有哪些途径可编辑R中的函数(