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,您可以使用任何对象进行换行