2016-11-16 1 views
1

Я пытаюсь сохранить выходные данные из поля forloop в матрице n.I в конце кода, но я уверен, что что-то не так с моей выходной матрицей. Он дает мне все одинаковые значения: 0 или 1. Я знаю, что print(SS) выводит правильные значения и может видеть, что forloop работает правильно.Для хранения контуров выходных данных

Есть ли у кого-нибудь какие-либо рекомендации относительно того, как исправить матрицу или каким-либо образом, что я могу хранить данные с forloop? Заранее спасибо!

c=0.2 
As=1  
d=1  
d0=0.5 
s=0.5 
e=0.1  
ERs=e/As  

C2 = c*As*exp(-d*s/d0)    

#Island States (Initial Probability)     
SS=0      


for(i in 1:5) { 
    if (SS > 0) { 
    if (runif(1, min = 0, max = 1) < ERs){ 
     SS = 0 
    } 
    } 
    else { 
    if (runif(1, min = 0, max = 1) < C2) { 
     SS = 1 
    } 
    } 
print(SS) 
} 
n.I=matrix(c(SS), nrow=i, ncol=1, byrow=TRUE) 

ответ

4

Эффективное решение здесь - не использовать петлю. Это не нужно, поскольку вся задача может быть легко векторизована.

Z =runif(100,0,1) 
as.integer(x <= Z) 
#[1] 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 
#[70] 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 
+0

Не могли бы вы подробно остановиться на том, что именно означает эта функция? Кажется, это дает мне аналогичные значения тому, что генерировал цикл for (т. Е. Этот способ работает). Я все еще новичок в обучении R и заметил, как люди, похоже, избегают использовать forloops, когда это вообще возможно. Почему это? Большое спасибо Роланду! –

+0

Вы должны прочитать «Введение в R». Это создает сразу 100 случайных значений и сравнивает ваше значение x со всеми этими моментами одновременно. Полученный логический вектор (значений TRUE/FALSE) затем превращается в целочисленный вектор (значения 1/0). Векторизация означает, что цикл происходит в скомпилированном коде, который быстрее на многие порядки. Векторизованный код обычно также гораздо читабельнее (как демонстрирует этот пример). – Roland

0

Вы можете сохранить их в списке. Не очень эффективно, но выполняет свою работу. list [[1]] указывает на первый элемент, сохраненный в списке, если вы хотите его получить.

list_pos <- list() # create the list out of the for loop 
    for(i in 1:100) { 
    c=0.10 #colonization rate 
    A=10 #Area of all islands(km^2) 
    d=250 #Distance from host to target (A-T) 
    s=0.1 #magnitude of distance 
    d0=100 #Specific "half distance" for dispersal(km) 
    C1 = c*A*exp(-d/d0) #Mainland to Target colonization 
    Z =runif(1,0,1) 
    x <- C1*A 


    if(x <= Z) { 
      list_pos[[i]] <- print("1") # Here you can store the 1 results.print is actually not necessary. 
    } 
    if(x >= Z){ 
      list_pos[[i]] <- print("0") # Here you can store the 0 results.print is actually not necessary. 
    } 
} 
Смежные вопросы