web-dev-qa-db-fra.com

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 - tilisation de l'instruction switch () - qui explique comment utiliser switch, mais qui ne m'aide pas vraiment car je souhaite effectuer des calculs plus sophistiqués (opérations de la matrice) et non un simple mean.

72
Simon

Bien, switch n'était probablement pas vraiment conçu pour 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 - généralement une chose simple, mais j'utilise ici un bloc bouclé pour que vous puissiez y insérer le code que vous voulez ...

90
Tommy

J'espère que cet exemple aide. Vous pouvez utiliser les accolades pour vous assurer que tout est inclus dans le sélecteur (vous ne connaissez pas le terme technique, mais le terme qui précède le signe = qui modifie ce qui se passe). Je pense que switch est un groupe d'instructions if () {} else {} plus contrôlé.

Chaque fois que la fonction de commutateur est identique mais que la commande fournie 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 dans 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")
40
Tyler Rinker

ces différentes façons de passer ...

# 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"
39
petermeissner