为了在范围之间进行比较,范围的最小值max(s)应始终大于范围的最大值min(s),如下所示:
library(dplyr)
library(stringr)
areTherePossibleValues <- function(s) {
str_split(s, pattern = " *& *", simplify = TRUE)[1, ] %>%
{lapply(c("max" = "<", "min" = ">"), function(x) str_subset(., pattern = x) %>% str_extract(., pattern = "[0-9]+"))} %>%
{as.numeric(min(.$max)) > as.numeric(max(.$min))}
}
更新:添加包含比较。
唯一的区别在于,范围最大值(s)的最小值可以等于范围最大值(s)的最大值。
library(dplyr)
library(stringr)
areTherePossibleValues <- function(s) {
str_split(s, pattern = " *& *", simplify = TRUE)[1, ] %>%
{lapply(c("max" = "<", "min" = ">"), function(x) str_subset(., pattern = x) %>% str_remove(., pattern = paste0("^.*", x)))} %>%
{ifelse(sum(grepl(pattern = "=", unlist(.))),
as.numeric(min(str_remove(.$max, "="))) >= as.numeric(max(str_remove(.$min, "="))),
as.numeric(min(.$max)) > as.numeric(max(.$min)))}
}
areTherePossibleValues("x<1 & x>2")
areTherePossibleValues("x>1 & x<2")
areTherePossibleValues("x>=1 & x<1")
<
和>
比较和&
运算符,则这不会太复杂。您只需检查“<”中常量的最小值是否大于“>”中常量的最大值即可。允许使用> =
,<=
和=
可能并不太复杂。但是放宽其他约束或尝试以完全一般的方式执行此操作很困难。例如添加|
(或),则需要定义运算符的优先级。 - Jeff Y