2016-05-04 10 views
3

スイッチには論理引数に問題があり、FALSEで評価することはできません。スイッチには論理引数に問題があります

> switch(T, "TRUE"=10, "FALSE"=50) 
[1] 10 
> switch(F, "TRUE"=10, "FALSE"=50) 
(No return value) 

私が知っているT/F値については、if/elseを使用できますが、スイッチの問題は別の問題です。

> switch(2, "TRUE"=10, "FALSE"=50, "2"=200) 
[1] 50 
> switch(2, "TRUE"=10, "FALSE"=50, 2=200) 
Error: unexpected '=' in "switch(2, "TRUE"=10, "FALSE"=50, 2=" 
Error during wrapup: argument "fun" is missing, with no default 

なぜこれが起こり、バグですか?機能ですか?

答えて

6

?switch

EXPRを言う:数値に評価される式または文字列

あなたはEXPRとしてそれを何か他のものを与えた場合、RはEXPRを変換することが可能に最低侵襲的強制を行います数字または文字列に変換する。この場合、論理値は数値に変換されます。問題は、F/FALSEが数値に強制変換されると0になり、なし、のオプションが選択されることです。 (ラベルはを無視している)それはハックですが、あなたは

a <- FALSE 
switch(a+1, "FALSE"=10, "TRUE"=50) ## 10 
a <- TRUE 
switch(a+1, "FALSE"=10, "TRUE"=50) ## 50 

を使用することができます...しかし、あなたはFALSE/TRUEためにオプションを入れて覚えておく必要があります。私はこれが難しい/非自明なので、これは悪い考えだと思う。慣用Rは、私が思うに、

if (a) 50 else 10 

だろう(これはあまりにもトリッキーに見えるが、スカラー比較のためifelse()に実際に好適であることが、あなたとあなたの同僚は、それがより見つけた場合、あなたは多くを失うことなくifelse()を使用することができます

2番目の例(switch(2, "TRUE"=10, "FALSE"=50, "2"=200))では、switch()に整数を指定し、Rは位置(2番目のオプションは値50)で選択します。 3番目の例(switch(2, "TRUE"=10, "FALSE"=50, 2=200))では、2は引数の有効な名前ではありません。

1

私はちょうど同じようなものが必要でした。つまり、TRUEFALSE、(論理)NAの値を返すだけでした。別の実行可能なオプションは、論理スカラー入力を文字に明示的に変換することです。


switch_fun <- function(x) { 
    switch(
    as.character(x), 
    `TRUE` = "TRUE!", 
    `FALSE` = "FALSE!", 
    "NA!" 
) 
} 

switch_fun(TRUE) 
#> [1] "TRUE!" 
switch_fun(FALSE) 
#> [1] "FALSE!" 
switch_fun(NA) 
#> [1] "NA!" 
関連する問題