回复 第1楼 的 LINL10:这是一个非常好的问题,我觉得有些时候,我们确实需要获取函数中定义的函数.
我希望哪位大牛把这个需求做出来
我的想法比较低端:
1.body(ARcop.theta),然后转换成可处理的,如as.character,然后字符串找f1的定义,比如搜索名字f1,然后找到function() {},这个可能需要比较准确的字符匹配
2.由于f1的定义的环境是ARcop.theta的执行环境,所以为了获得f1的定义我们可以
<br />
f=function(){<br />
f1=function(){<br />
1<br />
}<br />
f1<br />
function(){<br />
}<br />
}
然后
R>a<-f()<br />
R>environment(a)<br />
<environment: 0x0eeee9f8><br />
R>ls(environment(a))<br />
[1] "f1"<br />
R>environment(a)$f1<br />
function(){<br />
1<br />
}<br />
<environment: 0x0eeee9f8>
这样就找到了f1的定义,也就是通过返回一个函数,来记录这个返回函数的定义地环境,也就是f1所处的环境,然后从那个环境中获得f1的定义,当然这肯定需要修改最外面的函数让它返回一个闭包,例如这里的ARcop.theta
我们需要通过一些其他手段在body(ARcop.theta)中加入返回一个随便定义的函数(甚至可能需要去掉原函数的返回语句)
然后
<br />
newbody<-removeandaddnewreturn(ARcop.theta)<br />
ARcop.thetacall<-call("function",formals(ARcop.theta),newbody)<br />
ARcop.theta2<-eval(ARcop.thetacall)<br />
a<-ARcop.theta2(...)<br />
environment(a)</p>
<p>ls(environment(a))</p>
<p>environment(a)$f1
上面只是谈了个自己的感觉做法,修改一个函数的函数体通常该怎么做?我没有经验啊 也就是那个removeandaddnewreturn怎么写?
比如最简单的
<br />
f<-function(){<br />
1}<br />
我该如何通过修改body(f),来达成
f<-function(){<br />
1<br />
2<br />
}
??
</p>