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)
以下函数采用长度为 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)