Як використовувати оператор switch у функціях R?


81

Я хотів би використати для моєї функції в R оператор switch()для запуску різних обчислень відповідно до значення аргументу функції.

Наприклад, у Matlab ви можете це зробити, написавши

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

Я знайшов цей вираз post - switch (), який пояснює, як використовувати switch, але не дуже корисний для мене, оскільки я хочу виконувати більш складні обчислення (матричні операції), а не прості mean.

Відповіді:


112

Ну, switchмабуть, насправді не було призначено працювати так, але ви можете:

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

... кожен випадок - це вираз - зазвичай це просто просте, але тут я використовую фігурний блок, щоб ви могли туди вкласти будь-який код ...


6
чи є спосіб зробити це, не порівнюючи зі рядками? що здається широко неефективним.
Jules GM

10
switch()Мені як новому користувачеві , цікаво, чому ви говорите, що це не означає працювати так. Що ще ви очікуєте від оператора switch?
eric_kernfeld

46

ці різні способи перемикання ...

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

42

Сподіваюся, цей приклад допоможе. Ви можете використовувати фігурні дужки, щоб переконатись, що у вас є все, що вкладено в перемикач перемикача (вибачте, я не знаю технічний термін, але термін, який передує знаку =, який змінює те, що відбувається). Я думаю про комутатор як про більш контрольовану купу if () {} else {}заяв.

Кожного разу, коли функція перемикача однакова, але команда, яку ми надаємо, змінюється.

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!")
)

Ось вона знаходиться всередині функції:

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")

0

Це більш загальна відповідь на відсутність конструкції "Виберіть cond1, stmt1, ... else stmtelse" у R. Це трохи загазовано, але працює, нагадує оператор switch, присутній у 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
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.