当用sapply调用它们时,来自for循环的明显相同的向量输出和r中的逻辑子集函数有什么区别?

时间:2016-01-26 19:08:29

标签: r lapply

我是r语言的初学者,在尝试学习时遇到了令我困惑的事情。我编写了一个函数来查看向量并返回其中的所有负值。我已经完成了这两种方式,一次使用for循环:

#doing it with a for loop
below_zero <- function(x) {
    build <- c()
    for(i in x) {
        if(i < 0) {
        build <- append(build, i)
        }
    }
    return(build)
}

...或者,尝试使用逻辑子集来实现相同的目的:

 #doing it with logical subsetting
below_zero2 <- function(x) {
   negatives <- x[x < 0]
   return(negatives)
}

乍看之下,在包含正数和负数的样本矢量上运行以上各项似乎给出相同的结果,例如

> first <- below_zero(c(1,2,3,-4,-5,-6))
> second <- below_zero2(c(1,2,3,-4,-5,-6))
> first
[1] -4 -5 -6
> second
[1] -4 -5 -6
> str(first)
 num [1:3] -4 -5 -6
> str(second)
 num [1:3] -4 -5 -6

到目前为止一切都如预期的那样。但是,当我尝试使用sapply或lapply调用这两个函数时,会出现问题。他们现在提供的反馈略有不同:

> lapply(c(1,2,3,-4,-5,-6), below_zero)
[[1]]
NULL

[[2]]
NULL

[[3]]
NULL

[[4]]
[1] -4

[[5]]
[1] -5

[[6]]
[1] -6

> lapply(c(1,2,3,-4,-5,-6), below_zero2)
[[1]]
numeric(0)

[[2]]
numeric(0)

[[3]]
numeric(0)

[[4]]
[1] -4

[[5]]
[1] -5

[[6]]
[1] -6

有人可以向我解释这种差异来自何处(使用循环时NULLS,但使用子集时为0)?我实际上并没有尝试在这里获得特定的结果,只是提高了我对它是如何工作的理解。

由于 保罗

0 个答案:

没有答案