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

时间:2016-04-26 08:38:12

标签: r conditional

以下函数采用长度为1或2的字符向量x,并检查它是否包含 变量a和b中的字符串 - 请注意,x不应在同一元素中包含a和b。 然后返回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"  

1 个答案:

答案 0 :(得分:2)

有很多停止和检查功能,可以采取相当直接的行动。

这是另一种选择:

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)