Использование оператора if-else для условного определения функции в `R` - PullRequest
7 голосов
/ 03 апреля 2012

В R я определяю функцию lengths в зависимости от значения ранее установленного параметра:

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 ]

9 голосов
/ 03 апреля 2012

Вы можете использовать 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 голосов
/ 03 апреля 2012

Быстрый взлом, основанный на предложении 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] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...