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

当使用sapply调用for循环和r中的逻辑子集函数时,它们的向量输出明显相同,这两者之间有什么区别?,r,lapply,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) } }

我是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)
}
有人能给我解释一下这种差异的来源吗(使用循环时为空,但使用子集时为0)?我并不是真的想在这里达到一个特定的结果,只是想提高我对其工作原理的理解

谢谢
Paul

在第二种情况下,得到的不是0,而是零长度向量。为什么要使用
lappy
?在
lappy
中,对
c(1,2,3,-4,-5,-6)
的每个元素调用函数,而不是对整个向量调用函数。对于
NULL
vs
numeric(0)
部分,请参见
c()
(在第一个函数中使用,如果没有否定项,则返回)vs
1[FALSE]
(在第二个函数中,由于没有否定项,仅使用
FALSE
s子集时使用)。谢谢!我的错误是假设c()将创建一个长度为0的向量。
 #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
> 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