我是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)?我实际上并没有尝试在这里获得特定的结果,只是提高了我对它是如何工作的理解。
由于 保罗