Dason의 접근 방식은 시원하지만, 인간에 의해 더 읽기 무언가를 원하는 경우,이 사용
`%&%` <- function(e1, e2) ifelse(is.na(e1)|is.na(e2), NA, e1 & e2)
결과 :
> x <- c(TRUE, FALSE, NA)
> outer(x, x, `%&%`)
[,1] [,2] [,3]
[1,] TRUE FALSE NA
[2,] FALSE FALSE NA
[3,] NA NA NA
편집 : 벤치마킹 :
그것은해야을 다음과 같이 Dason의 접근 방식이 가장 빠릅니다.
library(microbenchmark)
library(compiler)
x <- sample(c(TRUE, FALSE, NA), size=1e3, TRUE)
y <- sample(c(TRUE, FALSE, NA), size=1e3, TRUE)
`%&1%` <- function(e1, e2) ifelse(is.na(e1)|is.na(e2), NA, e1 & e2)
`%&2%` <- function(x, y) (!x | y) & (x | y) & (x | !y)
`%and%` <- function(x, y)as.logical(x*y)
참고 :
`%C&2%` <- cmpfun(`%&2%`)
`%C&1%` <- cmpfun(`%&1%`)
`%Cand%` <- cmpfun(`%and%`)
> microbenchmark(x %&1% y, x %&2% y, x %and% y, x %C&1% y, x %C&2% y, x %Cand% y, times=1000)
Unit: microseconds
expr min lq median uq max neval
x %&1% y 201.575 206.124 208.574 211.024 1822.917 1000
x %&2% y 86.439 87.140 87.839 88.190 1244.441 1000
x %and% y 13.299 13.999 14.349 14.700 1141.905 1000
x %C&1% y 200.525 205.775 208.574 210.674 1554.151 1000
x %C&2% y 84.690 85.390 86.090 86.440 1212.596 1000
x %Cand% y 13.299 13.649 14.349 14.699 1141.555 1000
재미, 컴파일러가 변경되지 않습니다 %&2%
이의 일이 무엇인지보기 위해이 모든 것을 컴파일하자 난 그냥
:-) 행운에 의해 발견 한 재미있는 대안이다 아무것도 없어!
실제 R 구문에 넣어두면 도움이 될 것입니다. – Thomas
당신은'any'를 시도 할 수 있습니다 ...'xx <- c (1,2,3, NA, 4,5); any (is.na (xx))' – Arun
@Arun'any'는'|'의 확장이며'|'는 실제로 호프만이 원하는 방식으로 작동합니다. '&'의 확장자는'all'이며 동일한 문제가 – Dason