alle.default()条件返回值的代码说明

时间:2014-07-23 05:34:22

标签: r

我在median.default中遇到了一段我无法理解的代码。它涉及na.rm = FALSE时的返回值,并且向量确实包含至少一个NA值。

有问题的代码是

x[FALSE][NA]

可在body

median.default元素4和6中找到
> bod <- body(median.default)
> bod[[4]]
# if (na.rm) 
#     x <- x[!is.na(x)] 
# else if (any(is.na(x))) 
#     return(x[FALSE][NA])
> bod[[6]]
# if (n == 0L) 
#     return(x[FALSE][NA])

当我打破这段代码时,那就是我迷失的地方。我只是不明白它的目的。

为什么只要写return(NA)就可以这样写?或者使用as.numeric(NA)或其他as.*函数?

> x <- c(1, NA, 5, NA, 12)
> if(any(is.na(x))) x[FALSE][NA]
# [1] NA
> x[FALSE]
# numeric(0)
> if(any(is.na(x))) NA
# [1] NA

如果答案是将NA值转换为同一类x,那么为什么不使用as.*

> Y <- c(as.integer(NA), as.double(NA), as.numeric(NA)) 
> sapply(Y, function(x) c(class(x), typeof(x), mode(x)))
#      [,1]      [,2]      [,3]     
# [1,] "numeric" "numeric" "numeric"
# [2,] "double"  "double"  "double" 
# [3,] "numeric" "numeric" "numeric" 

1 个答案:

答案 0 :(得分:2)

我认为这就是他们如何返回相同类型x的NA。

来源:中位数的inside-r页。

示例:

> x <- 1:3
> y <- NA
> z <- x[FALSE][NA]
> class(x)
[1] "integer"
> class(y)
[1] "logical"
> class(z)
[1] "integer"
> x
[1] 1 2 3
> y
[1] NA
> z
[1] NA
> 

进一步的例子,说明为什么两者都需要:

> x
[1] 1 2 3
> x[FALSE]
integer(0)
> x[NA]
[1] NA NA NA
> x[FALSE][NA]
[1] NA
> 

添加[FALSE]会将x减少为零长度向量(但仍为数字)。添加[NA]会使其实际返回NA。