在R中为for循环中的向量添加值

时间:2015-09-03 03:56:19

标签: r function for-loop

我刚刚开始学习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的末尾并返回一个向量。有人可以指出这个代码有什么问题。

1 个答案:

答案 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("^")