Вы имеете в виду, как это:
wantVec <- c(3,1,2)
myList <- list(A = c(1:3), B = c(3,1,2), C = c(2,3,1))
sapply(myList, function(x, want) isTRUE(all.equal(x, want)), wantVec)
## or, is the vector in the set?
any(sapply(myList, function(x, want) isTRUE(all.equal(x, want)), wantVec))
Мы можем сделать аналогичное с матрицей:
myMat <- matrix(unlist(myList), ncol = 3, byrow = TRUE)
## As the vectors are now in the rows, we use apply over the rows
apply(myMat, 1, function(x, want) isTRUE(all.equal(x, want)), wantVec)
## or
any(apply(myMat, 1, function(x, want) isTRUE(all.equal(x, want)), wantVec))
Или по столбцам:
myMat2 <- matrix(unlist(myList), ncol = 3)
## As the vectors are now in the cols, we use apply over the cols
apply(myMat, 2, function(x, want) isTRUE(all.equal(x, want)), wantVec)
## or
any(apply(myMat, 2, function(x, want) isTRUE(all.equal(x, want)), wantVec))
Если вам нужно много делать, напишите свою собственную функцию
vecMatch <- function(x, want) {
isTRUE(all.equal(x, want))
}
А затем используйте его, например, в списке myList
:
> sapply(myList, vecMatch, wantVec)
A B C
FALSE TRUE FALSE
> any(sapply(myList, vecMatch, wantVec))
[1] TRUE
Или даже обернуть все это:
vecMatch <- function(x, want) {
out <- sapply(x, function(x, want) isTRUE(all.equal(x, want)), want)
any(out)
}
> vecMatch(myList, wantVec)
[1] TRUE
> vecMatch(myList, 5:3)
[1] FALSE
РЕДАКТИРОВАТЬ: Быстрый комментарий о том, почему я использовал isTRUE()
, обернутый вокруг all.equal()
вызовов. Это связано с тем, что если два аргумента не равны, all.equal()
не возвращает логическое значение (FALSE
):
> all.equal(1:3, c(3,2,1))
[1] "Mean relative difference: 1"
isTRUE()
здесь полезен, потому что возвращает TRUE
, если его аргумент равен TRUE
, а возвращает FALSE
, если это что-то еще.