我刚刚开始学习R,我编写了这段代码来学习函数和循环。
squared<-function(x){
m<-c()
for(i in 1:x){
y<-i*i
c(m,y)
}
return (m)
}
squared(5)
NULL
为什么返回NULL。我希望i*i
值附加到m
的末尾并返回一个向量。有人可以指出这个代码有什么问题。
答案 0 :(得分:4)
由于您没有使用作业,因此未在循环中放置m <- c()
内的任何内容。你得到以下 -
m <- c()
m
# NULL
您可以通过在循环中指定m
来更改函数以返回所需的值。
squared <- function(x) {
m <- c()
for(i in 1:x) {
y <- i * i
m <- c(m, y)
}
return(m)
}
squared(5)
# [1] 1 4 9 16 25
但这是低效的,因为我们知道结果向量的长度将是5(或x
)。所以我们想在循环之前先分配内存。这将是使用for()
循环的更好方法。
squared <- function(x) {
m <- vector("integer", x)
for(i in seq_len(x)) {
m[i] <- i * i
}
m
}
squared(5)
# [1] 1 4 9 16 25
另请注意,我已从第二个功能中删除了return()
。它没有必要,所以可以删除它。在这种情况下保留它是个人偏好的问题。有时需要,例如在if()
语句中。
我知道这个问题是关于循环的,但我也必须提一下,使用原语^
可以使用七个字符更有效地完成此操作,就像这样
(1:5)^2
# [1] 1 4 9 16 25
^
是一个原始函数,这意味着代码完全用C语言编写,并且是这三种方法中效率最高的
`^`
# function (e1, e2) .Primitive("^")