7

次の式があるとします。

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

与えられたオブジェクトfrはRに関数を返します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)
4

2 に答える 2

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)
于 2012-04-19T09:21:18.507 に答える
2

位置による抽出のために、数式内の名前付き関数にフラグを立てることができるというspecials引数があります。terms

だから、あなたは書くことができます

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]))
}

それからあなたのテストケースは与える

> 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代わりに、これを名前付き関数でネストするようにストライキすることができます。

于 2015-08-06T19:42:01.730 に答える