【问题标题】:Restrict argument to range of numbers将参数限制为数字范围
【发布时间】:2017-10-14 21:44:28
【问题描述】:

我希望限制参数 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-esque 的方式来做到这一点。

【问题讨论】:

    标签: r


    【解决方案1】:

    如果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)
    }
    

    【讨论】:

    • 是的,这些很有帮助,我喜欢第二个。我一直在寻找类似示例的解决方案,但这仍然是一个干净的解决方案
    【解决方案2】:

    请注意,ifelse 函数有一点开销,这可能无关紧要。不过,为了完整起见,此解决方案可以做到并且更快

    > 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
    

    【讨论】:

    • 感谢您提出另一个解决方案,但我不明白 'k * (!test) + 3 * test' 行的作用。你能解释一下吗?
    • as.numeric(FALSE) 为零,as.numeric(TRUE) 为一。因此,根据test 的值,上面给出了k3
    猜你喜欢
    • 2020-04-03
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 2010-11-22
    • 2023-03-04
    相关资源
    最近更新 更多