R 从子函数中的父函数求值函数

R 从子函数中的父函数求值函数,r,eval,parent-child,R,Eval,Parent Child,假设我有一个函数: MyFunction=function(x,y,z,thelist){ a = x+3 b = y+4 c = z+2 mylist=thelist myfunc1=function(form=a) a+2 myfunc2=function(form=b) b+2 myfunc3=function(form=c) c+2 functi

假设我有一个函数:

MyFunction=function(x,y,z,thelist){            
   a = x+3    
   b = y+4
   c = z+2

   mylist=thelist   
   myfunc1=function(form=a) a+2         
   myfunc2=function(form=b) b+2         
   myfunc3=function(form=c) c+2         

   function(...){         
      .x = as.list(substitute(list(...)))[-1]         
      CombinedList = lapply(seq_along(mylist), function (y,.x) {            
         numbercols = length(eval(.x[[1]])(form=eval(formals(eval(.x[[1]]))$form))[[1]])                
         numbercolsplusone = numbercols+1            
         elementz = matrix(NA,nrow=length(.x),ncol=numbercolsplusone)

         for (i in seq_along(.x)) {                        
           elementz[i,1:numbercols] = eval(.x[[i]])(form=eval(formals(eval(.x[[i]]))$form))[[y]] 

           elementz[i,numbercolsplusone] = substr(as.character(.x[[i]]),1,nchar(as.character(.x[[i]]))-4)                
         }   
         ....
         Some more calculations....
         ....

      },.x)

      return(CombinedList)  
   }
}
然后,我从
父函数
中选择,比如说
myfunc1
myfunc2
,并调用我的玩具函数:

MyFunction=function(x,y,z,thelist){            
   a = x+3    
   b = y+4
   c = z+2

   mylist=thelist   
   myfunc1=function(form=a) a+2         
   myfunc2=function(form=b) b+2         
   myfunc3=function(form=c) c+2         

   function(...){         
      .x = as.list(substitute(list(...)))[-1]         
      CombinedList = lapply(seq_along(mylist), function (y,.x) {            
         numbercols = length(eval(.x[[1]])(form=eval(formals(eval(.x[[1]]))$form))[[1]])                
         numbercolsplusone = numbercols+1            
         elementz = matrix(NA,nrow=length(.x),ncol=numbercolsplusone)

         for (i in seq_along(.x)) {                        
           elementz[i,1:numbercols] = eval(.x[[i]])(form=eval(formals(eval(.x[[i]]))$form))[[y]] 

           elementz[i,numbercolsplusone] = substr(as.character(.x[[i]]),1,nchar(as.character(.x[[i]]))-4)                
         }   
         ....
         Some more calculations....
         ....

      },.x)

      return(CombinedList)  
   }
}
try = Myfunction(x,y,z,thelist)(myfunc1,myfunc2)
这是一个toyfunction,我的真实函数要长得多,计算起来要花很多时间。我想问题在于子函数中的for循环——可能是我使用的
eval

与其他类似函数相比,此函数的计算时间更长,不同之处在于,我先调用父函数中的所有函数,然后再调用子函数,
function(…){
。并且不选择此玩具示例中的函数


还有其他更快捷的方法吗?

@joran谢谢!有什么建议吗?我编辑只是为了让它可读。我完全不明白你在问什么。我必须同意。似乎很多代码都是多余的,没有用例,不清楚目标是什么。在R-help上,Jim Holtman的标记行是顺理成章的“不要告诉我你是如何失败的;告诉我应该做什么。”@DWin谢谢你的评论!我正在编写一个函数来分析时间序列数据。上面的代码旨在从父函数中选择一些特定函数到子函数
函数(…){}
。这些特定函数采用不同的形式默认参数。因此,子函数中的
eval
会计算这些默认参数。它工作正常,但速度非常慢。因此,我想我可以在这里询问R向导:)