2017-10-14 95 views
1

我期待限制R.我見過this例如涉及限制值字符參數k可以取值範圍,但我感興趣的數值。限制參數號

爲了進一步解釋什麼是我要找的,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

是的,這些都是有益的,我喜歡第二個。我一直在尋找像例如解決方案,但,這是一個乾淨的解決方案提出了另一種解決方案仍然 – 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 *(!測試)+ 3 *測試」一樣。你可以解釋嗎? – Porteous96

+0

'as.numeric(FALSE)'爲零,'as.numeric(TRUE)'爲一。因此,根據'test'的值,上面給出了'k'或'3'。 –