4

给定两个值xb,我想要一个函数钳位x[-b, b]. 尤其是:

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

在 RI 中写了以下函数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)
4

2 回答 2

10

我会使用pminandpmax函数来做到这一点,这是一个没有语句的单个表达式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))来修复您的函数。这是一个工作版本(我冒昧地使用<=而不是单独检查<and ==):

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

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

于 2015-09-16T04:31:12.497 回答
3

您可以使用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
于 2019-01-30T05:32:29.860 回答