将所有逻辑规则与向量匹配并按相同顺序

Match all logic rules with a vector and in the same order

我有一个接受两个向量的函数

  1. 逻辑规则向量pat
  2. 数据向量dat

该函数检查所有规则是否已按正确顺序执行

dat <- 1:100
pat <- c( "dat<4 & dat>2", "dat>6", "dat>99" )

yes.seq.rule <- function(pat , dat){
  lv <- rep(F,length(pat))
  k <- 1
  for(i in 1:length(dat)){
      res <- eval(parse(text = pat[k]))[i]
      if(res) 
      {
        lv[k] <- TRUE
        k <- k+1 
      }
    if(k==length(pat)+1) break
  }
  return(  all(lv)  )
}

函数returns真/假

完全相同的问题被问到完全相同的功能,唯一的区别是在这个问题中向量 pat 是逻辑规则

问题: 有没有可能让这个功能更快

这是一个选项,它只会循环表达式而不是数据

f1 <- function(pat, dat) {
   tmp_lst <- lapply(pat, function(x) {
            i1 <- eval(parse(text = x))
              if(any(i1)) min(which(i1))
       })
   if(!any(sapply(tmp_lst, is.null))) {
        tmp <- unlist(tmp_lst)
        identical(tmp, sort(tmp))
    } else FALSE
 }
   

f1(pat, dat)
#[1] TRUE

循环lapply中的patterns,evaluate,得到minimum索引,检查只有FALSE的地方情况即如果有任何模式 returns 全部为 FALSE,则结果为 FALSE, 或者 unlist 并使用 sorted 索引

检查它是否是 identical

基准

pat <- c( "dat<4 & dat>2", "dat>6", "dat>199", "dat>1e7" )
dat <- 1:1000000
system.time(f1(pat, dat))
#  user  system elapsed 
# 0.036   0.005   0.042