2015-09-03 2 views
1

Я только что начал изучать R, и я написал этот код, чтобы узнать о функциях и циклах.Добавление значений в вектор внутри цикла цикла в 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

Вы никогда ничего не кладете в 'm <- c()'. –

+3

Я думаю, вы хотите '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

ответ

3

Вы не поместили ничего внутри 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("^") 
+1

7 символов ... pfft. Расточительное! – thelatemail

+0

@thelatemail - Я чувствую, что, возможно, переделал его там. Ха-ха –

+0

@RichardScriven Спасибо за объяснение. Я хотел бы знать, почему '<-' используются и не могут' = 'использоваться в R? То есть я не могу закодировать как 'y = i * i'? Нужно ли быть как 'y <-i * i' –

Смежные вопросы