在范围内钳制变量
Clamp variable within range
给定两个值 x
和 b
,我想要一个函数将 x
限制在 [-b, b]
内。特别是:
- 如果
x
小于等于-b
,则函数returns -b
;
- 如果
x
大于-b
小于b
,则函数returnsx
;
- 如果
x
大于等于b
,则函数returnsb
.
在 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)
我会使用 pmin
和 pmax
函数来完成这是一个没有 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)
).这是一个工作版本(我冒昧地使用 <=
而不是单独检查 <
和 ==
):
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
编写的函数可以将整个向量作为输入,而您的函数仅限于采用单个数字。
您可以使用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
给定两个值 x
和 b
,我想要一个函数将 x
限制在 [-b, b]
内。特别是:
- 如果
x
小于等于-b
,则函数returns-b
; - 如果
x
大于-b
小于b
,则函数returnsx
; - 如果
x
大于等于b
,则函数returnsb
.
在 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)
我会使用 pmin
和 pmax
函数来完成这是一个没有 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)
).这是一个工作版本(我冒昧地使用 <=
而不是单独检查 <
和 ==
):
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
编写的函数可以将整个向量作为输入,而您的函数仅限于采用单个数字。
您可以使用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