2012-04-03 87 views
7

R,我定義取決於參數的先前設置的值的函數lengths使用if-else語句中`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的問題,但爲什麼不有一個函數'長度'接受'condition'作爲參數並做一些明智的事情? – csgillespie 2012-04-03 15:06:19

+1

試試'?switch'也許? – BenBarnes 2012-04-03 15:07:25

回答

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]