2012-04-03 34 views
7

で関数を定義するためのif-elseステートメントを使用して、私は以前に設定されたパラメータの値に応じて機能lengthsを定義しています:は条件付きで<code>R</code>で `R`

に条件付きで関数を定義する
if(condition == 1){ 
    lengths <- function(vector) { 
     n <- ceiling(length(vector)/2) 
    } 
} 
else if(condition == 2){ 
    lengths <- function(vector) { 
     n <- length(vector) 
    } 
} 
else if(condition == 3){ 
    lengths <- function(vector) { 
     n <- length(vector)*2 
    } 
} 
else{ 
    lengths <- function(vector) { 
     n <- length(vector)+10 
    } 
} 

このやり方はほんの少しばかり...ちょっとしたようです。より良い方法がありますか?

+2

Daft質問ですが、「条件」を引数にとり、賢明なことを行う「長さ」関数を持っていないのはなぜですか? – csgillespie

+1

'?switch'おそらく試してみますか? – BenBarnes

答えて

9

あなたはswitchを使用することができます。

lengths <- function(vector, condition) { 
    switch(condition, 
    ceiling(length(vector)/2), 
    length(vector), 
    length(vector)*2, 
    length(vector)*+10) 
} 

この機能は、より多くのあなたのコード例のような振る舞いを提供します。

lengths <- function(vector, condition) { 
    switch(as.character(condition), 
    `1`=ceiling(length(vector)/2), 
    `2`=length(vector), 
    `3`=length(vector)*2, 
    length(vector)*+10) 
} 

...と、この関数はconditionの値によって定義されます。

condition <- 1 
lengths <- switch(as.character(condition), 
    `1`=function(vector) ceiling(length(vector)/2), 
    `2`=function(vector) length(vector), 
    `3`=function(vector) length(vector)*2, 
    function(vector) length(vector)*+10) 
lengths 
# function(vector) ceiling(length(vector)/2) 
0

CSGillespieの提案に基づく迅速なハック:

length.lut <- cbind(c(0.5,1,2,1,),c(0,0,0,10)) 

lengths <- function(vector, condition) vector*length.lut[condition,1] + length.lut[condition,2]