R 执行多个逻辑操作的有效方法

R 执行多个逻辑操作的有效方法,r,performance,R,Performance,假设我有三个长度相同的向量 vec1 <- c(1,2,3,10) vec2 <- c(1,4,5,8) vec3 <- c("==","<=",">=","==") 它可以工作,但是如果向量较大,并且你必须做很多事情,那么速度会很慢。有更好的方法吗? 向量的排序方式使得最有可能返回FALSE的比较首先出现。 我要补充的是,实际上向量的长度是28。vec2和vec3是常量,vec1是变

假设我有三个长度相同的向量

vec1 <- c(1,2,3,10)
vec2 <- c(1,4,5,8)
vec3 <- c("==","<=",">=","==")
它可以工作,但是如果向量较大,并且你必须做很多事情,那么速度会很慢。有更好的方法吗? 向量的排序方式使得最有可能返回FALSE的比较首先出现。
我要补充的是,实际上向量的长度是28。vec2和vec3是常量,vec1是变量。

这可以简化为

f1 <- function(v1, v2, oper) {

  all(Reduce(`&`, lapply(oper, function(op) match.fun(op)(v1, v2))))

 }

f1(vec1, vec2, vec3)
#[1] FALSE

这可以归结为

f1 <- function(v1, v2, oper) {

  all(Reduce(`&`, lapply(oper, function(op) match.fun(op)(v1, v2))))

 }

f1(vec1, vec2, vec3)
#[1] FALSE
也许你可以试试这样的eval+呼叫

all(mapply(function(op, a, b) eval(call(op, a, b)), vec3, vec1, vec2))
或者矢量化+do.call

也许你可以试试这样的eval+呼叫

all(mapply(function(op, a, b) eval(call(op, a, b)), vec3, vec1, vec2))
或者矢量化+do.call

一个purrr选项可以是:

all(pmap_lgl(list(vec1, vec2, vec3), ~ exec(..3, ..1, ..2)))

[1] FALSE
一个purrr选项可以是:

all(pmap_lgl(list(vec1, vec2, vec3), ~ exec(..3, ..1, ..2)))

[1] FALSE

这些是矢量化操作,您可以执行vec1==vec2,您可以使用任何对象进行换行。这些是矢量化操作,您可以执行vec1==vec2,您可以使用任何对象进行换行