2016-02-15 2 views
-4

Начинающий программист R здесь. Я использую симуляцию Aliens vs. Vampires и их господство в человеческом роде.Отсутствует значение, в котором требуется значение TRUE FALSE R ... не дубликат! Пришельцы против вампиров Моделирование

Два оговорки к этой имитации:

Иностранцы могут похитить вампир. Сумма пропорциональна текущему проценту вампиров от общей численности населения мира (включая людей).

У вампиров есть требования к здоровью. Они не только могут превратить людей в вампиров, но они также нуждаются в некоторых, чтобы питаться и убить ...

У меня возникают проблемы с пониманием этого часть кода и почему он не работает:

if (A[i-1] + A.prime * delta.t <= 0){ 
    A[i]<-0 
    } else { 
    A[i] <- A[i-1] + A.prime * delta.t 
    } 

Это возвращает эту ошибку:

Error in if (A[i - 1] + A.prime * delta.t <= 0) { : missing value where TRUE/FALSE needed

Вот весь код, я уверен, что это просто код ошибки, а не логический. Любая помощь будет оценена!

# Aliens v. Vampires -- version 2.1 
# (logistic growth with human reproduction) 
# CPSC 420 -- spring 2016 


# Set up time. 
delta.t <- 1 # years 
time <- seq(1940,3000,delta.t) 

# Utility functions to convert between i and t. 
itot <- function(i) (i-1)*delta.t + 1940 
ttoi <- function(t) (t-1940)/delta.t + 1 

# Simulation parameters. 
init.human.pop <- 7e9 
alien.abduction.rate <- 30000  # (beings/year)/year 
bite.rate <- .1    # (people/year)/vampire 
birth.rate <- .01    # (people/year)/person 
sacrifice.rate<- .1 #people/year/vampire 
#There is no specific rate for vampires being abducted per year because it is a portion of the alien abduction rate 
A <- vector() 
V <- vector() 
H <- vector() 
earth.population <- vector() 
V.abductions<-vector() 
sacrifice<- vector() 

# Initial conditions. (No aliens until 1940, and only one lonely vampire.) 
A[1] <- 0 
V[1] <- 1 
H[1] <- init.human.pop 
earth.population[1] <- V[1] + H[1] 
V.abductions[1]<-0 
sacrifice[1]<-0 


# Simulate. 
for (i in 2:length(time)) { 

    logistic.factor <- H[i-1]/earth.population[i-1] 

    # Compute flows. 
    VA.prime<-alien.abduction.rate * (time[i]-1940) * (V[i-1]/earth.population[i-1]) #vampires abducted/year 
    sacrifice.prime<- sacrifice.rate * (V[i-1]) #sacrifice/year 
    V.prime <- bite.rate * V[i-1] * logistic.factor - VA.prime# people/year 
    A.prime <- alien.abduction.rate * (time[i] - 1940) * (logistic.factor) + VA.prime # beings/year 
    H.prime <- H[i-1] * birth.rate - (V.prime + (A.prime - VA.prime) + sacrifice.prime) # people/year 
    earth.population.prime <- -A.prime - sacrifice.prime # people/year 

    if(H[i-1] - sacrifice[i-1]<0){ 
    V.prime <- V.prime - (abs(sacrifice[i-1] - H[i-1])*sacrifice.rate) 

    } else { 
    V.prime <- bite.rate * V[i-1] * logistic.factor - VA.prime# people/year 
    } 


    # Compute stocks. 
    if (A[i-1] + A.prime * delta.t <= 0){ 
    A[i]<-0 
    } else { 
    A[i] <- A[i-1] + A.prime * delta.t 
    } 

    # people abducted 

    if(V[i-1] + V.prime * delta.t <= 0) { 
    V[i] <-0 
    } else { 
    V[i] <- V[i-1] + V.prime * delta.t 
    }    # vampires 

    if(H[i-1] + H.prime * delta.t <= 0){ 
    H[i]<-0 
    } else { 
    H[i]<-H[i-1] + H.prime * delta.t 
    } #humans left 

    if(V[i] + H[i] <= 0){ 
    earth.population[i]<-0 
    }else{ 
     earth.population[i] <- V[i] + H[i] 
    } 

    # people 

    V.abductions[i]<- V.abductions[i-1] + VA.prime * delta.t #total vampires abducted thus far 
    sacrifice[i]<-sacrifice[i-1] + sacrifice.prime * delta.t #total victims sacrificed to vampires thus far 
} 


# Plot results. 
all.values <- c(A,V,H,earth.population) 
plot(time,A,type="l",col="green",lwd=2, 
    ylim=c(min(all.values),max(all.values)), 
    main="Aliens v. Vampires apocalypse -- oh my!!", 
    xlab="year", 
    ylab="# of victims") 
lines(time,V,col="red",lwd=2) 
lines(time,H,col="black",lwd=1) 
lines(time,earth.population,col="brown",lty="dotted",lwd=3) 
lines(time,V.abductions,col="purple",lty="dashed",lwd=1) 
lines(time,sacrifice,col="blue", lty = 3, lwd=1) 
legend("topleft",legend=c("Alien abductions","Vampire bites","Humans","Earthlings", "Vampires Abducted","Human Victims"), 
     fill=c("green","red","black","brown", "purple","blue")) 

ответ

2

Оператор A[i-1] + A.prime * delta.t <= 0 вычисляет NA, и что вызывает ошибку. if хочет знать, является ли это TRUE или FALSE, и NA не является ни тем, ни другим.

A.primeNaN, так вот, где начинается ваша проблема. A.prime проверяет, является ли A простым числом, но поскольку это вектор, этот оператор не дает никакого значения.

+0

Я не понимаю, что вы подразумеваете под «Первыми испытаниями, если A является простым числом», он должен вычислить значение и присвоить его вектору A.prime –

+0

А, да, я пропустил эту часть в вашем коде. Ну, тогда эта часть не работает, потому что после присвоения 'A.prime' равно' NaN'. Вы должны попробовать и отладить это задание. Сначала попробуйте части выражения и узнайте, какие части заданий не работают так, как вы ожидаете, что они будут работать. – Gijs

0

В какой-то момент (шаг i = 336), земля.популяция упала до 0, так что logistic.factor является делением на 0. Возможно, вы хотите добавить условие для ввода цикла.

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