2010-06-04 35 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中的函數(