2015-04-06 4 views
2

Я думаю, что у меня есть небольшая проблема синтаксиса сахара с помощью [R]:х || г против mapply (функция (х, у) х || у, х, у) в [R]

x=rnorm(1000,mean = 1,sd = 1) 
y=rnorm(1000,mean = 1,sd = 1) 
x=x>1 
y=y>1 
x||y 
mapply(function(x,y) x||y,x,y) 

в основном я хочу, чтобы получить список логического типа, где элемент является значение TRUE, когда либо соответствующий элемент по х и у являются ИСТИНА

но

x||y 

возвращает скалярное значение TRUE, тогда как в

mapply(function(x,y) x||y,x,y) 

выполняет эту работу.

Так что же я неправильно на синтаксисе

x||y 

?

Большое спасибо ...

ответ

2

Вы можете просто сделать x | y получить векторизованную результат. x || y сравнивает только первый элемент x с первым элементом y.

Чтобы понять это, необходимо учитывать следующее:

TRUE | FALSE 
# [1] TRUE 
TRUE || FALSE 
# [1] TRUE 

c(TRUE, FALSE) | c(TRUE, FALSE) 
# [1] TRUE FALSE 
c(TRUE, FALSE) || c(TRUE, FALSE) # only first element is compared 
# [1] TRUE 

c(FALSE, TRUE) | c(FALSE, TRUE) 
# [1] FALSE TRUE 
c(FALSE, TRUE) || c(FALSE, TRUE) # only first element is compared 
# [1] FALSE 

mapply не нужен здесь, потому что это просто воссоздавать поведение |:

identical(c(FALSE, TRUE) | c(FALSE, TRUE), mapply(function(x,y) x || y, c(FALSE, TRUE),c(FALSE, TRUE))) 
# [1] TRUE 
identical(c(TRUE, FALSE) | c(FALSE, TRUE), mapply(function(x,y) x || y, c(TRUE, FALSE),c(FALSE, TRUE))) 
# [1] TRUE 

mapply также является гораздо более вычислительно дорогой:

microbenchmark::microbenchmark(mapply(function(x,y) x||y, x, y), x | y) 
Unit: microseconds 
           expr  min  lq  mean median  uq  max neval cld 
mapply(function(x, y) x || y, x, y) 1495.294 1849.006 2186.77275 2012.776 2237.936 5320.702 100 b 
           x | y 27.713 28.868 39.97163 33.871 38.297 166.657 100 a 
+0

Hi Thomas, tha nks много - хотя я думаю, что объяснение Паскаля является правильным –

+0

@RomeoKienzler Нет, это не совсем правильно. – Thomas

+0

@ Томас прав. –

Смежные вопросы