2016-07-31 5 views
0

私は多くの順次関数を持っているとします。各関数の結果は、シーケンス内の次の関数に使用されます。これを見てスマート要件の検索

start <- "somevar" 
a <- fun_a(start) 
b <- fun_b(a) 
c <- fun_c(b) 
d <- fun_d(c) 
e <- fun_e(d) 
f <- fun_f(e) 

もう一つの方法は次のようになります:私がやりたい何

start %>% fun_a %>% fun_b %>% fun_c %>% fun_d %>% fun_e %>% fun_f 

それがするべきことを、私は例えば「D」を渡したときに理解し、動的に何かを持っていますfun_efun_fを実行します。

Rには、このタイプのプログラミングにいくつかの機能がありますか?

コンピュータ科学者の視点からこの概念をどのように参照するかを知っているなら、ボーナスポイント。

+0

たぶん、あなたは[この](https://github.com/rbertolusso/intubate) – user2100721

+0

を探しています(make' 'のようなものを探しているhttp://matt.might.net/articles/intro-to-make /)? –

+0

異なる順次オブジェクトがどのように認識されるかについて、より具体的な例を提供できますか?コタモリの "クラス"の例に加えて、 "attr" ibuteや引数の可能な値(例えば 'match.arg'など)に応じて、単純な' switch'を使うこともできますか? –

答えて

2

関数の動作をオブジェクト名で変更することはできません(少なくとも自然な方法で)。 しかし、オブジェクトのクラスに基づいて関数の動作を指定することができます。 これは、関数のオーバーロードと呼ばれる概念です。 これはあなたがしたいことに近いと思います。

Rでは、これを汎用関数(Hadley's Advanced Rを参照)で実装できます。

ここは簡単な例です。 MuFuncの動作は、渡されたオブジェクトが属するクラスによって変更されます。 また、関数があなたの例のように別の関数を呼び出すように、再帰的な構造を使います。

MyFunc <- function(x, ...) { 
    UseMethod("MyFunc") 
} 

MyFunc.default <- function(x, ...) { 
    print("running MyFunc.default") 
    class(x) <- c("A", class(x)) 
    MyFunc(x) 
} 

MyFunc.A <- function(x, ...) { 
    print("running MyFunc.A") 
    class(x) <- c("B", class(x)) 
    MyFunc(x) 
} 

MyFunc.B <- function(x, ...) { 
    print("running MyFunc.B") 
    class(x) <- c("C", class(x)) 
    MyFunc(x) 
} 

MyFunc.C <- function(x, ...) { 
    print("running MyFunc.C (Terminal Function)") 
    class(x) <- c("D", class(x)) 
} 

MyFunc(1) 
##[1] "running MyFunc.default" 
##[1] "running MyFunc.A" 
##[1] "running MyFunc.B" 
##[1] "running MyFunc.C (Terminal Function)" 

x <- 1 
class(x) <- "B" 
MyFunc(x) 
##[1] "running MyFunc.B" 
##[1] "running MyFunc.C (Terminal Function)" 
+0

私はs3を使うことさえ考えなかった。ニース。 –