2017-10-14 11 views
1

kがRに持つことができる値を制限することを検討しています。thisの例では数値を文字に制限していますが、数値に興味があります。引数を数値の範囲に制限する

kは1〜10の間で指定できますが、値が指定されていない場合はデフォルト値3です。

私は、次の操作を行うことができることを知っている:

foo <- function(k = 3) { #check k is in range of 1 and 10 here #if not in range then set it to 3 }

これを行うのがよりR-風の道があるのならば、私はちょうど思っていました。

答えて

2

kが整数である場合は、これを試してみてください。

if (!(k %in% 1:10)) k = 3 

kは任意の数値である場合、これは役立つかもしれない:

k = ifelse(k < 1 | k > 10, 3, k) 

をお勧めとして、この機能にするために、あなたが行くだろう:

foo <- function(k = 3) { 
    k = ifelse(k < 1 | k > 10, 3, k) 
    return(k) 
} 
+0

ええ、それらは役に立ちます、私は第2のものが好きです。私は例のような解決策を探していましたが、それでもきれいな解決策です。 – Porteous96

1

ifelse fおそらく問題ではないかもしれない統制。しかし、完全性のために、この解決策はより速くなり、より速くなります。

> f1 <- function(k = 3) 
+ ifelse(k < 1 | k > 10, 3, k) 
> 
> f2 <- function(k = 3){ 
+ test <- k < 1 | k > 10 
+ k * (!test) + 3 * test 
+ } 
> 
> x <- rnorm(1e5, sd = 10) 
> all.equal(f1(x), f2(x)) 
[1] TRUE 
> 
> microbenchmark::microbenchmark(f1(x), f2(x)) 
Unit: milliseconds 
    expr  min  lq  mean median  uq  max neval 
f1(x) 7.416093 9.543104 13.464866 10.038314 10.823893 80.44003 100 
f2(x) 1.594468 2.060443 3.983543 2.224986 3.647207 71.04627 100 
+0

別の解決策を提案してくれてありがとうございますが、私は 'k *(!test)+ 3 * test 'という行を理解できません。説明できますか? – Porteous96

+0

'as.numeric(FALSE)'はゼロで、 'as.numeric(TRUE)'は1です。したがって、 'test'の値に応じて' k'か '3'のいずれかになります。 –