Вы не поместили ничего внутри 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("^")
Вы никогда ничего не кладете в 'm <- c()'. –
Я думаю, вы хотите 'm <- c (m, y)' вместо просто 'c (m, y)'. При этом вы действительно не должны создавать векторы, добавляя один элемент за раз - см. Второй круг [R inferno] (http://www.burns-stat.com/pages/Tutor/R_inferno.pdf) для деталей. Часть красоты R - это векторизованные операции - вы можете просто выполнить квадрат <- function (x) x^2'. Это гораздо менее типизируется и намного эффективнее. – josliber