2012-04-19 16 views
5

मान लीजिए मैं एक निम्न सूत्र है:आर में सूत्र में सूत्र का एक हिस्सा कैसे चुनें?

fr <- formula(y~myfun(x)+z) 

को देखते हुए वस्तु fr वहाँ आर में एक समारोह जो myfun(x) देता है? मैंने अपना खुद का फ़ंक्शन लिखा है (नीचे कोड) जो मूल रूप से मुझे चाहिए जो करता है, लेकिन शायद ऐसा करने का कुछ मानक तरीका है?

मेरी समारोह के लिए कोड:

selectmds <- function(expr,funcn) { 
    if(length(expr)>2) { 
     a <- expr[[2]] 
     b <- expr[[3]] 
     if(length(a)>1) { 
      if(as.name(a[[1]])==funcn) { 
       if(length(grep(funcn,all.names(b)))>0) { 
        return(list(a,selectmds(b,funcn))) 
       } 
       else return(list(a)) 
      } 
     } 
     if(length(b)>1) { 
      if(as.name(b[[1]])==funcn) { 
       if(length(grep(funcn,all.names(a)))>0) { 
        return(list(b,selectmds(a,funcn))) 
       } 
       else return(list(b)) 
      } 
     } 
     for(i in 2:length(expr)) { 
      if(length(grep(funcn,all.names(expr[[i]])))>0)return(selectmds(expr[[i]],funcn)) 
     } 
    } 
    return(NULL) 
} 

यहाँ कई उदाहरण हैं:

> selectmds(formula(y~myfun(x)+z),"myfun") 
[[1]] 
myfun(x) 


> unlist(selectmds(formula(y~myfun(x)+z+myfun(zz)),"myfun")) 
[[1]] 
myfun(zz) 

[[2]] 
myfun(x) 

उत्तर

7

सुनिश्चित नहीं हैं कि यह सबसे अच्छा है, लेकिन आप से यह कर सकते हैं: तो

f <- function(fm, fun) { 
    l <- as.list(attr(terms(fm), "variables"))[-1] 
    l[grep(fun, l)] 
} 

,

> f(formula(y~myfun(x)+z),"myfun") 
[[1]] 
myfun(x) 

> f(formula(y~myfun(x)+z+myfun(zz)),"myfun") 
[[1]] 
myfun(x) 

[[2]] 
myfun(zz) 
+0

मैं जो देख रहा था उससे काफी करीब था। पार्सिंग सूत्र मजेदार है, लेकिन किसी और को मेरे लिए उन्हें पार्स करना अच्छा लगता है :) – mpiktas

+0

मुझे आश्चर्य है: शायद 'f' की परिभाषा को स्ट्रिंग ऑब्जेक्ट के रूप में परिभाषित करने का एक तरीका है, यानी' fname <- "formula (y ~ माईफुन (सामान) + जेड) "'। फिर आप "~" और ")" के बीच सबकुछ के लिए 'grep' कर सकते हैं। –

+0

@CarlWitthoft, मुझे भी ब्रांड्स में सामान की आवश्यकता है। सूत्र को कनवर्ट करना और grep का उपयोग करना मेरी राय में एक अच्छा विचार नहीं है। – mpiktas

2

specialsterms पर तर्क है जो आपको स्थिति के अनुसार निष्कर्षण के लिए सूत्र में नामित कार्यों को ध्वजांकित करने की अनुमति देता है।

तो, आप

selectmds<-function(form,fn) { 
    tt<-terms(form,specials=fn); 
    idx<-attr(tt,"specials"); 
    v<-as.list(attr(tt,"variables"))[-1]; 
    unlist(lapply(idx,function(i) v[i])) 
} 

लिख सकते हैं तो आपके testcases

> selectmds(formula(y~myfun(x)+z),"myfun") 
$myfun 
myfun(x) 

> selectmds(formula(y~myfun(x)+z+myfun(zz)),"myfun") 
$myfun1 
myfun(x) 

$myfun2 
myfun(zz) 

देना लेकिन, आप भी

> selectmds(formula(y~myfun(x)+myfun(x2)+z+yourfun(zz)),c("myfun","yourfun")) 
$myfun1 
myfun(x) 

$myfun2 
myfun(x2) 

$yourfun 
yourfun(zz) 

कर सकते हैं आप कहाँ unlist हड़ताल सकता है इस नेस्टेड के लिए इसके बजाय नामित समारोह द्वारा।

संबंधित मुद्दे