R:对矢量的不同元素进行不同的范围检查

时间:2014-02-20 17:41:57

标签: r

是否有一个R idiom用于对向量的每个元素执行不同的(整数)范围检查?

我的函数传递了v = c(m, n)形式的两元素(整数)向量,并且必须进行以下范围检查:

  1. 1 <= m <= M
  2. 1&lt; = n&lt; = N
  3. 对于我当前的任务,我已经通过手动访问每个元素并对其运行相关的范围检查来实现它们。

    # Check if this is a valid position on an M x N chess board.
    validate = function (square) {
        row = square[1]
        col = square[2]
        (row %in% 1:M) && (col %in% 1:N)
    }
    

    我想知道是否有更复杂的方法来进行范围检查,特别是如果我们将其推广到K元素向量。

3 个答案:

答案 0 :(得分:1)

由于您可能会为每个v[j]设置不同的条件,因此我建议您根据范围标准创建一个列表。像:

Rgames> set.seed(10)
Rgames> foo<-sample(1:5,5,rep=TRUE)
Rgames> foo
[1] 3 2 3 4 1
Rgames> bar<-list(one=1:5, two=3:5,three=1:3,four=c(2,4),five=c(1,4) )
Rgames> checkit<-NA
Rgames> for(j in 1:5) checkit[j]<-foo[j]%in%bar[[j]]
Rgames> checkit
[1]  TRUE FALSE  TRUE  TRUE  TRUE

答案 1 :(得分:1)

如果我正确理解你的目标,那么不等式运算符在R中被矢量化,所以你可以利用这个事实。

limits <- c(M=3, N=4, 5)
v <- c(m=2, n=5, 8)
result <- 1 <= v & v <= limits
#    m     n       
# TRUE FALSE FALSE 

如果您希望单个值为FALSE(如果超出任何限制),则可以使用all包装不等式表达式。

all(1 <= v & v <= limits)

答案 2 :(得分:0)

也许是这样的:

`%between%` <- function(x,rng){
    all(x <= max(rng,na.rm = TRUE)) && all(x >= min(rng,na.rm = TRUE))
}

> 3 %between% c(1,10)
[1] TRUE
> 3:5 %between% c(1,10)
[1] TRUE
> 9:12 %between% c(1,10)
[1] FALSE

根据你想要处理NA的方式以及其他边缘情况进行调整。