Хотя мне очень нравятся ваши методы и я люблю увеличение скорости, к сожалению, они теряют свои способности, когда e1
e2
имеют более сложную структуру, чем вектор.
> dim(a) <- c(1e2, 1e4)
> dim(b) <- c(1e2, 1e4)
>
> identical(!a, my.not(a))
[1] FALSE
> identical(a & b, my.and(a, b))
[1] FALSE
> identical(a | b, my.or(a, b))
[1] FALSE
> identical(xor(a, b), my.xor(a, b))
[1] FALSE
Логические функции сохраняют структуру и атрибуты, что является дорогостоящим, но имеет ценность.
T <- TRUE; F <- FALSE
A <- matrix(c(T, F, T, F), ncol=2)
B <- matrix(c(T, F, F, T), ncol=2)
> A & B
[,1] [,2]
[1,] TRUE FALSE
[2,] FALSE FALSE
> my.and(A, B)
[1] TRUE FALSE FALSE FALSE
Также, как указано в комментариях, NA
также необходимо учитывать - то есть, больше накладных расходов.
a <- c(T, F, NA, T)
b <- c(F, NA, T, T)
> identical(!a, my.not(a))
[1] TRUE
> identical(a & b, my.and(a, b))
[1] FALSE
> identical(a | b, my.or(a, b))
[1] FALSE
> identical(xor(a, b), my.xor(a, b))
[1] TRUE
a <- c(T, F, NA, T)
b <- c(F, NA, T, T)
names(a) <- names(b) <- LETTERS[23:26]
> a & b
W X Y Z
FALSE FALSE NA TRUE
> my.and(a, b)
[1] FALSE NA NA TRUE
<час> Конечно, с учетом всего вышесказанного, ваши функции предлагают невероятное увеличение! Если вы знаете, что вам не нужно беспокоиться о NA и подобных вещах, и вы не заботитесь о структуре, то почему бы просто не использовать их!