R関数でswitchステートメントを使用するにはどうすればよいですか?


81

Rの関数にステートメントを使用してswitch()、関数の引数の値に応じて異なる計算をトリガーしたいと思います。

たとえば、Matlabでは次のように書くことでそれを行うことができます

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

この投稿(switch()ステートメントの使用法)switch、使用方法を説明していますが、単純ではなく、より高度な計算(行列演算)を実行したいので、あまり役に立ちませんmean

回答:


112

まあ、switchおそらく実際にはこのように機能することを意図していませんでしたが、次のことができます。

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

...それぞれのケースは式です-通常は単純なものですが、ここではカーリーブロックを使用して、必要なコードをそこに詰め込むことができます...


6
文字列と比較せずにこれを行う方法はありますか?それは広く非効率的なようです。
ジュール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

これは、Rで欠落している「Selectcond1、stmt1、... else stmtelse」構造に対するより一般的な答えです。少しガスが多いですが、Cに存在するswitchステートメントに似ています。

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
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.