2012-04-03 19 views
7

, ben önceden ayarlanmış bir parametre değerine bağlı olarak işlevini lengths tanımlayan ediyorum if-else şartlı R` `de bir işlevi tanımlamak için deyim: şartlı bir işlev tanımlamakullanma bir <code>R</code> yılında

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

Bu şekilde sadece biraz ... dağınık görünüyor. Daha iyi bir yolu var mı?

+2

Daft sorusu, ancak neden 'koşul' işlevini bir argüman olarak alan ve mantıklı bir şey yapan bir fonksiyona sahip değil? – csgillespie

+1

Belki 'anahtarını' deneyin? – BenBarnes

cevap

9

Sen switch kullanabilirsiniz:

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

Bu fonksiyon daha fazla örnek kodu gibi davranış sağlamaktadır:

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

... ve bu fonksiyon condition değeriyle belirlenecektir:

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'nin önerisine göre hızlı bir şekilde kesmek:

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] 
İlgili konular