106 votes

Comment utiliser l'instruction switch dans les fonctions R ?

Je voudrais utiliser pour ma fonction dans R l'instruction switch() pour déclencher un calcul différent en fonction de la valeur de l'argument de la fonction.

Par exemple, dans Matlab, vous pouvez le faire en écrivant

switch(AA)        
case '1'   
...   
case '2'   
...   
case '3'  
...  
end

J'ai trouvé ce post - Utilisation de l'instruction switch() - qui expliquent comment utiliser switch mais il ne m'est pas vraiment utile car je veux effectuer des calculs plus sophistiqués (opérations matricielles) et non pas une simple opération de calcul. mean .

134voto

Tommy Points 16323

Bien, switch n'est probablement pas censé fonctionner comme ça, mais vous pouvez :

AA = 'foo'
switch(AA, 
foo={
  # case 'foo' here...
  print('foo')
},
bar={
  # case 'bar' here...
  print('bar')    
},
{
   print('default')
}
)

...chaque cas est une expression - habituellement une chose simple, mais ici j'utilise un curly-block pour que vous puissiez y insérer le code que vous voulez...

7 votes

Existe-t-il un moyen de faire cela sans comparer à des chaînes de caractères ? cela semble très inefficace.

24 votes

En tant que nouvel utilisateur de switch() Je me demande pourquoi vous dites que ce n'est pas censé fonctionner comme ça. Qu'attendez-vous d'autre d'une instruction switch ?

61voto

marvin_dpr Points 625

ces différentes manières de commuter ...

# by index
switch(1, "one", "two")
## [1] "one"

# by index with complex expressions
switch(2, {"one"}, {"two"})
## [1] "two"

# by index with complex named expression
switch(1, foo={"one"}, bar={"two"})
## [1] "one"

# by name with complex named expression
switch("bar", foo={"one"}, bar={"two"})
## [1] "two"

52voto

Tyler Rinker Points 27607

J'espère que cet exemple vous aidera. Vous pouvez utiliser les accolades pour vous assurer que vous avez bien tout enfermé dans le type switcher changeur (désolé, je ne connais pas le terme technique mais le terme qui précède le signe = qui change ce qui se passe). Je vois le switch comme un ensemble plus contrôlé de if () {} else {} déclarations.

Chaque fois, la fonction de l'interrupteur est la même, mais la commande que nous fournissons change.

do.this <- "T1"

switch(do.this,
    T1={X <- t(mtcars)
        colSums(mtcars)%*%X
    },
    T2={X <- colMeans(mtcars)
        outer(X, X)
    },
    stop("Enter something that switches me!")
)
#########################################################
do.this <- "T2"

switch(do.this,
    T1={X <- t(mtcars)
        colSums(mtcars)%*%X
    },
    T2={X <- colMeans(mtcars)
        outer(X, X)
    },
    stop("Enter something that switches me!")
)
########################################################
do.this <- "T3"

switch(do.this,
    T1={X <- t(mtcars)
        colSums(mtcars)%*%X
    },
    T2={X <- colMeans(mtcars)
        outer(X, X)
    },
    stop("Enter something that switches me!")
)

Ici, c'est à l'intérieur d'une fonction :

FUN <- function(df, do.this){
    switch(do.this,
        T1={X <- t(df)
            P <- colSums(df)%*%X
        },
        T2={X <- colMeans(df)
            P <- outer(X, X)
        },
        stop("Enter something that switches me!")
    )
    return(P)
}

FUN(mtcars, "T1")
FUN(mtcars, "T2")
FUN(mtcars, "T3")

1voto

Rolf L Points 9

Il s'agit d'une réponse plus générale à la connstruction manquante "Select cond1, stmt1, ... else stmtelse" en R. C'est un peu lourd, mais cela fonctionne et ressemble à l'instruction switch présente en C

while (TRUE) {
  if (is.na(val)) {
    val <- "NULL"
    break
  }
  if (inherits(val, "POSIXct") || inherits(val, "POSIXt")) {
    val <- paste0("#",  format(val, "%Y-%m-%d %H:%M:%S"), "#")
    break
  }
  if (inherits(val, "Date")) {
    val <- paste0("#",  format(val, "%Y-%m-%d"), "#")
    break
  }
  if (is.numeric(val)) break
  val <- paste0("'", gsub("'", "''", val), "'")
  break
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X