R 中具有两个模式和一个列表输入的模式匹配

Pattern matching in R with two patterns and a list input

以下函数采用长度为 1 或 2 的字符向量 x,并检查它是否包含 变量 a 和 b 中的字符串 - 请注意 x 不应在同一元素中包含 a 和 b。 然后 returns a 或 b 或两者。 有更简洁的方法吗?

match_vec <- function(x, a = "alpha", b = "beta") {
  stopifnot(is.character(x), is.character(a), is.character(b))
  stopifnot(length(a) == 1, length(b) == 1)
  stopifnot(length(x) %in% c(1, 2))
  ai <- grep(a, x)
  bi <- grep(b, x)
  if (length(x) == 1) {
    if (length(ai) == 1 && length(bi) == 0) {
      return(a)
    } else if (length(ai) == 0 && length(bi) == 1) {
      return(b)
    } else {
      stop(paste("Could not find", a, "xor", b, "in:", x))
    }
  }
  if (length(x) == 2) {
    if (length(ai) == 1 && length(bi) == 1) {
      stopifnot(ai != bi)
      return(c(a, b))
    } else {
      stop(paste("Could not find both", a, "and", b, "in:", x, collapse = "\n"))
    }
  }
}


match_vec(c("alpha", "beta"))
#[1] "alpha" "beta" 
match_vec(c("beta", "alpha"))
#[1] "alpha" "beta" 
match_vec("alpha")
#[1] "alpha"
match_vec("betaaaa")
#[1] "beta"
match_vec("bettaaaa")
#Error in match_vec("bettaaaa") : 
# Could not find alpha xor beta in: bettaaaa
match_vec("alphaandbeta")
#Error in match_vec("alphaandbeta") : 
# Could not find alpha xor beta in: alphaandbeta
match_vec(c("this has thealpha", "beta in here"))
#[1] "alpha" "beta"  

有很多停止和检查功能,可用于相当直接的操作。

这是一个替代方案:

match_vec<-function(n) sapply(c("alpha", "beta"), function(x) grep(x, n, value=T))

match_vec(c("alpha", "beta"))
  alpha    beta 
"alpha"  "beta"

match_vec(c("beta", "alpha"))
  alpha    beta 
"alpha"  "beta" 

match_vec("alpha")
$alpha
[1] "alpha"

$beta
character(0)

match_vec("betaaaa")
$alpha
character(0)

$beta
[1] "betaaaa"

match_vec("bettaaaa")
$alpha
character(0)

$beta
character(0)