2

我认为我使用 [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)

基本上我想获得一个布尔类型的列表,其中当 x 和 y 中的相应元素为 TRUE 时,元素为 TRUE

x||y

返回 TRUE 的标量值,而

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

做这项工作。

那么我做错了什么

x||y 

句法?

非常感谢...

4

1 回答 1

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 
于 2015-04-06T08:41:31.467 回答