2012-04-03 11 views
7

R में, मैं समारोह lengths एक पैरामीटर का मान पहले से निर्धारित के आधार पर परिभाषित करने हूँ: मेंका उपयोग करते हुए एक अगर-बाकी बयान सशर्त `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

दाफ्ट प्रश्न, लेकिन क्यों एक कार्य 'लंबाई' नहीं है जो 'शर्त' में तर्क के रूप में होती है और कुछ समझदार होती है? – csgillespie

+1

शायद 'स्विच' का प्रयास करें? – 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

सीएसजीलेस्पी के सुझाव पर आधारित एक त्वरित हैक:

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] 
संबंधित मुद्दे