Traduções desta página:

Ferramentas do usuário

Ferramentas do site


05_curso_antigo:r2019:alunos:trabalho_final:ingrid.paschoaletto:codigo
##### Gazela saltitante - Jogo da sinalizacao honesta #####

#Esta funcao foi criada para executar o jogo da gazela saltitante, utilizado na disciplina 
#de comportamento animal (pelo menos em 2019) para que os alunos compreendessem, de uma forma
#mais pratica, como funciona o modelo de sinalizacao honesta de qualidade. Ela pode ser executada 
#uma vez so (quando simular=FALSE), para que o aluno tenha acesso a perspectiva de um individuo ou 
#(se simular=TRUE) quantas vezes o usuario quiser (default=100), para ver como o modelo se comporta 
#na populacao. Segue o codigo:


#Cria a funcao gazela.saltitante com 3 argumentos (que possuem um default mas podem ser alterados pelo usuario)
gazela.saltitante <- function(simular=TRUE, repetir= 100, rodadas=15)
{
#Controla o fluxo da funcao de acordo com o valor logico atribuido ao argumento 'simular' pelo usuario, realizando as seguintes tarefas se simular==FALSE
  if(simular==FALSE)
  {
#Cria o data.frame 'g' contendo:
#os individuos 1 e 2 (gazelas) e NA (leao), 
#um valor de vigor para cada gazela atraves de um sample de 2 valores entre 1:10 sem repeticao e NA para o leao
#Cria a coluna classe, mas ainda nao atribui valores
#Nomeia as linhas do data.frame como G1(gazela 1),G2(gazela 2) e L(leao)
    g <- data.frame(ind = c(1,2,NA),vigor = c((sample(1:10,2)),NA), classe = NA, row.names = c("G1","G2","L"))
#Ordena as linhas do data.frame de acordo com o valor do vigor
    g <- g[order(g$vigor),]
#Atribui a coluna 'classe' os valores fr(fraca - gazela com menor vigor), fo(forte - gazela com maior vigor) e deixa  leao sem valor
    g$classe <- c("fr","fo", "NA")
#Cria o objeto fr, de valor igual ao numero do individuo na primeira linha do data.frame (coluna ind)
    fr <- g$ind[1]
#Cria o objeto fo, de valor igual ao numero do individuo na segunda linha do data.frame (coluna ind)
    fo <- g$ind[2]
#Cria a coluna 'salto', onde o valor do salto da gazela fraca e um valor entre 3:8 e o da forte e entre 5:10. O leao nao salta.
    g$salto <- c(sample(3:8,1),sample(5:10,1), 0)
#Informa aos jogadores o quanto a G1 saltou, sendo esta uma pista para o leao escolher a gazela
    cat(paste("A gazela 1 saltou", g$salto[which(g$ind==1)]))
#Informa aos jogadores o quanto a G2 saltou, sendo esta uma pista para o leao escolher a gazela
    cat(paste("\nA gazela 2 saltou", g$salto[which(g$ind==2)]))
#Cria a funcao interativa 'presas' para possibilitar que o leao escolha sua presa
    presas <- function() 
      {
#Cria o objeto 'escolha' para mostrar na tela a mensagem para o leao e aguardar a escolha do jogador no console do R
      escolha <- readline("Leao, escolha sua presa: ")
#Controla o fluxo para prosseguir de acordo com a escolha feita pelo jogador (nesta linha, se a escolha for a G1)
        if (substr(escolha, 1, 1) == 1)
#Informa ao jogadores a escolha feita pelo leao (nesta linha, se a escolha for a G1)
          cat("O leao escolheu a gazela 1!\nGazela 2, voce escapou de virar jantar de leao.\nGazela 1, run for your life! \n ")
#Controla o fluxo para prosseguir de acordo com a escolha feita pelo jogador (nesta linha, se a escolha for a G2)
        else
#Informa ao jogadores a escolha feita pelo leao (nesta linha, se a escolha for a G2)
          cat("O leao escolheu a gazela 2!\nGazela 1, voce escapou de virar jantar de leao.\nGazela 2, run for your life! \n ")
#A funcao 'presas' retorna a escolha feita pelo leao
      return(substr(escolha, 1, 1))
      }
#Cria o objeto 'presa' para guardar o resultado da funcao 'presas' transformado em um objeto de classe numerica
    presa <- as.numeric(presas())
#Cria o vetor pos.fo vazio para guardar as posicoes da gazela forte
    pos.fo <- NA
#Atribui o valor 5 a primeira posicao do vetor da gazela forte, pois esta comeca o jogo 5 posicoes a frente do leao
    pos.fo[1] <- 5
#Cria o vetor pos.fr vazio para guardar as posicoes da gazela fraca
    pos.fr <- NA
#Atribui o valor 5 a primeira posicao do vetor da gazela fraca, pois esta comeca o jogo 5 posicoes a frente do leao
    pos.fr[1] <- 5
#Cria o vetor pos.l vazio para guardar as posicoes do leao
    pos.l <- NA
#Atribui o valor 0 a primeira posicao do vetor do leao, pois este comeca o jogo na posicao 0
    pos.l[1] <- 0
#Controla o fluxo de acordo com a classe da presa escolhida pelo leao (neste caso, se a presa escolhida for a gazela forte)
    if(presa==fo)
    {
#Cria um loop para realizar as rodadas do jogo, onde r varia de 2 ate o numero de rodadas estabelecido pelo usuario no argumento rodadas
      for(r in 2:rodadas)
      {
#Realiza a jogada da gazela forte atraves de um sample de 5:10 e guarda no objeto pos.fo criado anteriormente
        pos.fo[r] = pos.fo[r-1]+sample(5:10,1)
#Realiza a jogada do leao atraves de um sample de 5:10 e guarda no objeto pos.l criado anteriormente
        pos.l[r] = pos.l[r-1]+sample(5:10,1)
#Mantem a gazela fraca na posicao 5 ja que ela nao foi escolhida
        pos.fr[r] = 5
#Controla o fluxo para verificar a cada rodada se a gazela foi pega ou nao (neste caso, ela sera pega se a posicao do leao for maior ou igual a dela)
        if(pos.l[r]>=pos.fo[r])
        {
#Informa aos jogadores que o leao predou a gazela
          message("\nGazela, voce foi predada, sashay away!\n ")
#Guarda no objeto 'txt' qual foi a gazela predada e em que rodada isso aconteceu
          txt <- paste("A gazela",presa,", que era forte, foi predada na rodada", r)
#Quebra o loop caso a gazela seja predada
          break()
        }
#Controla o fluxo para verificar a cada rodada se a gazela foi pega ou nao (neste caso, ela escapa se r atingir o valor do argumento rodadas, definido pelo usuario)
        if(r==rodadas)
#Guarda no objeto 'txt' que a gazela forte, que era o individuo X escapou
          txt <- paste("A gazela",presa,", que era forte, escapou!") 
      }
    }
#Controla o fluxo de acordo com a classe da presa escolhida pelo leao (neste caso, se a presa escolhida for a gazela fraca)
    if(presa==fr)
    {
#Cria um loop para realizar as rodadas do jogo, onde r varia de 2 ate o numero de rodadas estabelecido pelo usuario no argumento rodadas
      for(r in 2:rodadas)
      {
#Realiza a jogada da gazela fraca atraves de um sample de 2:7 e guarda no objeto pos.fr criado anteriormente
        pos.fr[r] = pos.fr[r-1]+sample(2:7,1)
#Realiza a jogada do leao atraves de um sample de 5:10 e guarda no objeto pos.l criado anteriormente 
        pos.l[r] = pos.l[r-1]+sample(5:10,1)
#Mantem a gazela forte na posicao 5 ja que ela nao foi escolhida
        pos.fo[r] = 5
#Controla o fluxo para verificar a cada rodada se a gazela foi pega ou nao (neste caso, ela sera pega se a posicao do leao for maior ou igual a dela)
        if(pos.l[r]>=pos.fr[r])
        {
#Informa aos jogadores que o leao predou a gazela
          message("\nGazela, voce foi predada, sashay away! \n ")
#Guarda no objeto 'txt' qual foi a gazela predada e em que rodada isso aconteceu
          txt <- paste("A gazela",presa,", que era fraca, foi predada na rodada", r)
#Quebra o loop caso a gazela seja predada 
          break()
        }
#Controla o fluxo para verificar a cada rodada se a gazela foi pega ou nao (neste caso, ela escapa se r atingir o valor do argumento rodadas, definido pelo usuario)
        if(r==rodadas)
#Guarda no objeto 'txt' que a gazela fraca, que era o individuo X escapou
          txt <- paste("A gazela",presa,", que era fraca, escapou!")
      }
    }
#Cria a matriz 'pos' com os as posicoes de pos.fo, pos.fr e pos.l, com 3 linhas e o tanto de colunas correspondente ao ultimo valor que r assumiu no for, 
#preenchendo a matriz por coluna e deixando as linhas sem nome, enquanto as colunas sao nomeadas como rodadas de 1 a r
    pos <- matrix(data=c(pos.fr,pos.fo,pos.l),nrow=3,ncol=r,byrow = TRUE, dimnames = list(NULL,paste("Rodada",1:r)))
#Cria o objeto 'data.final' juntando o data.frame 'g' e a matrix 'pos'
    data.final <- cbind(g,pos)
#Adiciona a coluna 'gasto energetico', onde o gasto das gazelas corresponde a posicao da ultima rodada menos 5 (posicao inicial delas)
#somado ao valor do salto. Ja o gasto do leao corresponde ao valor encontrado na ultima rodada
    data.final$Gasto_energetico <- c((data.final[1:2,ncol(data.final)]-5+data.final$salto[1:2]), data.final[3,ncol(data.final)])
#Cria o vetor 'resultado' que guarda uma lista com o data.frame 'data.final' e o objeto 'txt'
    resultado <- list(data.final, txt)
#Se simular=TRUE, a funcao gazela.saltitante ira retornar a lista 'resultado'
    return(resultado)
  }
#Controla o fluxo da funcao de acordo com o valor logico atribuido ao argumento 'simular' pelo usuario, realizando as seguintes tarefas se simular==TRUE
  if(simular==TRUE)
  {
#Cria uma matriz 2x2 vazia para guardar os resultados dos loops a seguir, onde cada linha e uma gazela (fraca ou forte) e cada coluna e o seu status (escapou ou morreu)
    status <- matrix(data=0,2,2,dimnames = list(c("Fraca","Forte"),c("Escapou","Morreu")))
#Cria um loop para repetir o jogo tantas vezes quanto determinado pelo usuario no argumento repetir
    for(i in 1:repetir)
    {
#Cria o objeto 'salto' para guardar o salto da gazela fraca (de 3:8) e da forte (de 5:10), nesta ordem
      salto <- c(sample(3:8,1),sample(5:10,1))
#Controla o fluxo para decidir qual gazela o leao ira perseguir
      if(salto[1]>=5&&salto[2]<=8)
      {
#Se o salto de ambas variar entre 5 e 8, a presa sera decidida com um sample, com 50% de chances pra cada
        presa <- sample(1:2,1)
      }
#Se o salto da fraca (1) for menor que 5, o leao escolhe a fraca como presa
      if(salto[1]<5)
      {
#A presa escolhida e a 1
        presa <- 1
      }
#Se o salto da forte (2) for maior que 8, o leao escolhe a fraca como presa
      if(salto[2]>8)
      {
#A presa escolhida e a 1
        presa <- 1
      }
#Cria o vetor pos.fo vazio para guardar as posicoes da gazela forte
      pos.fo <- NA
#Atribui o valor 5 a primeira posicao do vetor da gazela forte, pois esta comeca o jogo 5 posicoes a frente do leao
      pos.fo[1] <- 5
#Cria o vetor pos.fr vazio para guardar as posicoes da gazela fraca
      pos.fr <- NA
#Atribui o valor 5 a primeira posicao do vetor da gazela fraca, pois esta comeca o jogo 5 posicoes a frente do leao
      pos.fr[1] <- 5
#Cria o vetor pos.l vazio para guardar as posicoes do leao
      pos.l <- NA
#Atribui o valor 0 a primeira posicao do vetor do leao, pois este comeca o jogo na posicao 0
      pos.l[1] <- 0
#Controla o fluxo de acordo com a classe da presa escolhida pelo leao (neste caso, se a presa escolhida for a gazela fraca)     
      if(presa==1)
      {
#Soma um ao valor de gazelas fortes que escaparam na matriz 'status', ja que a escolhida foi a fraca
        status[2,1] <- status[2,1]+1
#Cria um loop para realizar as rodadas do jogo, onde r varia de 2 ate o numero de rodadas estabelecido pelo usuario no argumento rodadas
        for(r in 2:rodadas)
        {
#Realiza a jogada da gazela fraca atraves de um sample de 2:7 e guarda no objeto pos.fr criado anteriormente
          pos.fr[r] = pos.fr[r-1]+sample(2:7,1)
#Realiza a jogada do leao atraves de um sample de 5:10 e guarda no objeto pos.l criado anteriormente 
          pos.l[r] = pos.l[r-1]+sample(5:10,1)
#Controla o fluxo para verificar a cada rodada se a gazela foi pega ou nao (neste caso, ela sera pega se a posicao do leao for maior ou igual a dela)
          if(pos.l[r]>=pos.fr[r])
          {
#Soma um ao valor de gazelas fracas predadas na matriz 'status'
            status[1,2]<-status[1,2]+1
#Quebra o loop caso a gazela seja predada
            break()
          }
#Controla o fluxo para verificar a cada rodada se a gazela foi pega ou nao (neste caso, ela escapa se r atingir o valor do argumento rodadas, definido pelo usuario)
          if(r==rodadas)
#Soma um ao valor de gazelas fracas que escaparam na matriz 'status'
            status[1,1]<-status[1,1]+1
        }
      }
#Controla o fluxo de acordo com a classe da presa escolhida pelo leao (neste caso, se a presa escolhida for a gazela forte)
      if(presa==2)
      {
#Soma um ao valor de gazelas fracas que escaparam na matriz 'status', ja que a escolhida foi a forte        
        status[1,1] <- status[1,1]+1
#Cria um loop para realizar as rodadas do jogo, onde r varia de 2 ate o numero de rodadas estabelecido pelo usuario no argumento rodadas        
        for(r in 2:rodadas)
        {
#Realiza a jogada da gazela forte atraves de um sample de 5:10 e guarda no objeto pos.fo criado anteriormente          
          pos.fo[r] = pos.fo[r-1]+sample(5:10,1)
#Realiza a jogada do leao atraves de um sample de 5:10 e guarda no objeto pos.l criado anteriormente          
          pos.l[r] = pos.l[r-1]+sample(5:10,1)
#Controla o fluxo para verificar a cada rodada se a gazela foi pega ou nao (neste caso, ela sera pega se a posicao do leao for maior ou igual a dela)          
          if(pos.l[r]>=pos.fo[r])
          {
#Soma um ao valor de gazelas fortes predadas            
            status[2,2]<-status[2,2]+1
#Quebra o loop caso a gazela seja predada            
            break()
          }
#Controla o fluxo para verificar a cada rodada se a gazela foi pega ou nao (neste caso, ela escapa se r atingir o valor do argumento rodadas, definido pelo usuario)
          if(r==rodadas)
#Soma um ao valor de gazelas fortes que escaparam na matriz 'status'           
            status[2,1]<-status[2,1]+1
        }
      }
#Plota um barplot da matriz 'status', com colunas lado a lado, separadas em gazela forte e gazela fraca, com a barra da cor verde sendo as gazelas que escaparam e vermelha as que morreram,
#posiciona a legenda, nomeia o eixo Y de frequencia, limitada pelo argumento 'repetir'da funcao e coloca os valores do eixo na horizontal
      barplot(t(status),beside = T, names.arg = c("Gazela fraca","Gazela forte"), legend.text=T, args.legend = list(x = "topright", bty = "n", inset=c(-0.02,-0.02)), col = c("green","red"), ylab = "Frequencia", ylim = c(0,repetir), las=1)
      }
  }
}
05_curso_antigo/r2019/alunos/trabalho_final/ingrid.paschoaletto/codigo.txt · Última modificação: 2020/08/12 06:04 (edição externa)