R 是否有一个以谓词和向量作为参数的基函数,以及 returns 谓词为真的第一个成员?

Does R have a base function that takes a predicate and a vector as arguments, and returns the first member for which the predicate is true?

我认为 matchwhich 可以胜任这项任务,但他们似乎无法胜任。例如,假设我有函数 divisibleByFive<-function(x){x%%5==0} 并且我想找到向量的第一个成员(它的索引或它的值)123:456 使得 divisibleByFive returns true。这项工作是否有一个基函数,将 divisibleByFive (可能矢量化)和 123:456 作为参数?如果不是,解决这类问题的惯用方法是什么?

是的,那个函数是Filter。试试这个

Filter(divisibleByFive, 123:456)[[1L]]

但是,我真的不建议这样做,因为这个函数太通用了,因此在实践中有点慢。通常,你想要的东西可以通过这样的方式轻松实现

(x <- 123:456)[[which(divisibleByFive(x))[[1L]]]]

,正如 @SteveM 指出的那样。查看基准

Unit: microseconds
                                              expr   min     lq    mean median    uq   max neval cld
            Filter(divisibleByFive, 123:456)[[1L]] 238.3 245.35 270.543 250.45 275.9 475.4   100   b
 (x <- 123:456)[[which(divisibleByFive(x))[[1L]]]]   8.3   9.00  10.099   9.50   9.9  28.5   100  a 

我们可以使用which.max

x[which.max(divisibleByFive(x))]
#[1] 125

FindPosition.

divisibleByFive<-function(x){x%%5==0}
Find(divisibleByFive,123:456)#For the desired value.
Position(divisibleByFive,123:456)#For the index of the desired value

输出:

> Find(divisibleByFive,123:456)#For the desired value.
[1] 125

> Position(divisibleByFive,123:456)#For the index of the desired value
[1] 3