Как отметил @r2evans, если мы будем работать только с скаляр, а не вектор, мы можем использовать all
безопасно:
all(1 < 4, 5 > 7, 6 == 6)
Мой ответ ниже адреса в случае, когда вы работаете с несколькими логическими векторами, и хотели бы принять параллельно/element-wise all
. В качестве воспроизводимой примера предположим, что мы имеем логические векторы:
set.seed(0)
a1 <- sample(c(TRUE, FALSE), 5, replace = TRUE)
# [1] FALSE TRUE TRUE FALSE FALSE
a2 <- sample(c(TRUE, FALSE), 5, replace = TRUE)
# [1] TRUE FALSE FALSE FALSE FALSE
a3 <- sample(c(TRUE, FALSE), 5, replace = TRUE)
# [1] TRUE TRUE TRUE FALSE TRUE
Мы стремимся к решению, которые не подлежат числу логических векторов.
Вариант 1
Мы можем использовать Reduce
и "&"
:
## define a function
AND1 <- function (...) Reduce("&", list(...))
AND1(a1, a2, a3)
# [1] FALSE FALSE FALSE FALSE FALSE
бинарный оператор "&"
работает только с двумя входами, так что мы можем сделать
"&"(a1, a2)
но не
"&"(a1, a2, a3)
Reduce
здесь, чтобы помочь, итеративным применением "&"
:
tmp <- "&"(a1, a2)
"&"(a2, a3)
Следующие два варианта первого сбора всех логических векторов в матрицу. Затем в опции 2a используется строка all
, в то время как опция 2b использует rowSums
.
Вариант 2а
AND2a <- function (...) {
X <- do.call(cbind, list(...))
base::apply(X, 1L, all)
}
AND2a (a1, a2, a3)
# [1] FALSE FALSE FALSE FALSE FALSE
Вариант 2b
AND2b <- function (...) {
X <- do.call(cbind, list(...))
## `TRUE` is 1 and `FALSE` is 0 when doing arithmetic sum
## all `TRUE` is as same as row sums equal to `ncol(X)` or `dim(X)[2]`
base::rowSums(X) == dim(X)[2L]
}
AND2b (a1, a2, a3)
# [1] FALSE FALSE FALSE FALSE FALSE
Если '' x' и y' одиночные (не векторы), поэтому не все '(х> 1, у ! = 1, sin (x) <0) '? – r2evans
Я думаю, что ваш скалярный случай, безусловно, мощный и гибкий, но слишком много раз я вижу вопросы с недостаточным пониманием '&' versus '&&' в обоих направлениях. Разумеется, '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' действительно не является функционально-функциональным. – r2evans