这里有一个选项,它只在表达式上循环,而不是在数据上循环
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
环游世界
pat
lapply
eval
去吧,去拿
min
imum索引,在只有
FALSE
案例,即如果有任何模式返回所有FALSE,则结果为FALSE,
unlist
并检查它是否正确
identical
和
sort
基准
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