【问题标题】:Clamp variable within range范围内的钳位变量
【发布时间】:2020-09-18 00:22:18
【问题描述】:

给定两个值 xb,我想要一个将 x 限制在 [-b, b] 范围内的函数。特别是:

  • 如果x小于等于-b,则函数返回-b
  • 如果x大于-b且小于b,则函数返回x
  • 如果x大于或等于b,则函数返回b

在 R 中,我编写了以下函数 truncfn。此功能仅部分有效。我在哪里犯错了?有没有更简单的方法来做到这一点?

b <- 5

truncfn <- function(x){
  if((x<(-b))||(x==-b)) -b 
  if((x>(-b))&&(x<b)) x 
  if((x>b)||(x==b)) b
}

truncfn(10)
5
truncfn(4)
truncfn(-10)

【问题讨论】:

    标签: r clamp


    【解决方案1】:

    我会使用pminpmax 函数来做到这一点,这是一个没有if 语句的单一表达式:

    b <- 5
    x <- seq(-10, 10)
    pmax(pmin(x, b), -b)
    # [1] -5 -5 -5 -5 -5 -5 -4 -3 -2 -1  0  1  2  3  4  5  5  5  5  5  5
    

    您可以通过将第二个和第三个if 语句替换为else if 语句(或交替使用return(b)return(x)return(-b))来修复您的函数。这是一个工作版本(我冒昧地使用&lt;= 而不是单独检查&lt;==):

    truncfn <- function(x){
      if (x <= -b) -b
      else if (x > -b && x < b) x 
      else b
    }
    truncfn(10)
    # [1] 5
    truncfn(4)
    # [1] 4
    truncfn(-10)
    # [1] -5
    

    但请注意,我使用 pminpmax 编写的函数可以将整个向量作为输入,而您的函数仅限于单个数字。

    【讨论】:

      【解决方案2】:

      您可以使用raster::clamp

      library(raster)
      b <- 5
      v <- -10:10
      raster::clamp(v, -b, b)
      # [1] -5 -5 -5 -5 -5 -5 -4 -3 -2 -1  0  1  2  3  4  5  5  5  5  5  5
      

      【讨论】:

        猜你喜欢
        • 2011-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-13
        • 2021-10-04
        • 2022-01-17
        • 1970-01-01
        相关资源
        最近更新 更多