将所有逻辑规则与向量匹配并按相同顺序
Match all logic rules with a vector and in the same order
我有一个接受两个向量的函数
- 逻辑规则向量
pat
- 数据向量
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
中的pat
terns,eval
uate,得到min
imum索引,检查只有FALSE
的地方情况即如果有任何模式 returns 全部为 FALSE,则结果为 FALSE,
或者 unlist
并使用 sort
ed 索引
检查它是否是 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
我有一个接受两个向量的函数
- 逻辑规则向量
pat
- 数据向量
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
中的pat
terns,eval
uate,得到min
imum索引,检查只有FALSE
的地方情况即如果有任何模式 returns 全部为 FALSE,则结果为 FALSE,
或者 unlist
并使用 sort
ed 索引
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