【问题标题】:Match all logic rules with a vector and in the same order以相同的顺序将所有逻辑规则与一个向量匹配
【发布时间】:2021-03-03 20:20:18
【问题描述】:

我有一个需要两个向量的函数

  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)  )
}

函数返回真/假

here 用完全相同的函数问了完全相同的问题,唯一的区别是在这个问题中,向量pat 是逻辑规则

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

【问题讨论】:

    标签: r sequence rules


    【解决方案1】:

    这是一个仅循环表达式而不是数据的选项

    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
    

    遍历lapplyevaluate 中的patterns,获取minimum 索引,检查只有FALSE 的情况,即是否有任何模式返回所有FALSE,那么结果是假的, 否则unlist 并检查它是否是identicalsorted 索引

    基准测试

    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 
    

    【讨论】:

    • @mr.T 你能用那个规则更新你的帖子,以便我可以测试
    猜你喜欢
    • 2021-06-03
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    • 2023-01-26
    • 2016-03-23
    • 1970-01-01
    • 2018-04-20
    • 2015-02-18
    相关资源
    最近更新 更多