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?
我认为 match
或 which
可以胜任这项任务,但他们似乎无法胜任。例如,假设我有函数 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
Find
和 Position
.
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
我认为 match
或 which
可以胜任这项任务,但他们似乎无法胜任。例如,假设我有函数 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
Find
和 Position
.
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