\documentclass[a4paper, oneside, 10pt]{article}
\usepackage[english]{babel}
\usepackage[utf8x]{inputenc}
\usepackage{listings}
\date{\today}
\title{}
\author{}
\begin{document}



\textbf{Proposta 1: Índice de diversidade (shannon e simpson) por reamostragem}\lstset{frame=single}
\begin{lstlisting}
  
diversity.random<- function(x, indice = c("sh", "si"), nsim=100)
{
  x<- data.frame(x) #transforma o objeto de entrada em um data frame
  indice<- match.arg(indice) # indexa os niveis do argumento "indice" que serão empregados para os "ifs"
  nsim<- nsim #numero de simulações utilizados para a aleatorização dos dados
  x[x== " "] <- NA # converte os valores faltantes em NA's
  x[is.na(x)]<-0 #converte NA's em zero
  result<- rep(NA, nrow(x)) # cria um vetor com a mesma quantidade de linhas do data frame de entrada
  if(indice == "sh" ) # se argumento "indice" for igual a "sh", retorna o valores do indice de shannon
    for(j in 1:length(x[,1])) # permite calculo através das linhas 
    {
      ind.sh<- -sum((x[j,]/(sum(x[j,])))* ((log(x[j,]/(sum(x[j,]))))),na.rm = TRUE) # divide o valor da linha "[j,]" pela sua soma, em seguida irá multiplica pelo logaritimo natural, somando tudo ao final.
      result[j]<- ind.sh  #carrega os valores calculados no objeto "results"
    }
  
  if(indice =="si") # se argumento "indice" for igual a "si", retorna os valores do indice de simpson
    for(j in 1:length(x[,1])) # permite calculo através das linhas  
    {
      ind.si<-  sum((x[j,]/(sum(x[j,])))^2, na.rm=TRUE) # divide o valor da linha "[j,]" pela sua soma, em seguida irá multiplica pelo logaritimo natural, somando tudo ao final. 
      result[j]<- 1- ind.si #carrega os valores calculados no objeto "results"
    }
  
  s.result<- list(rep(NA, nrow(x)),nsim) # irá retornar um lista com uma quantide de matrizes igual ao numero de simulações informados no "nsim"
  s.result[[1]]<-result #guarda o indice observado no primeiro objeto da lista "s.result"
  if(indice == "sh" ) # se indice igual a "sh" o looping irá calcular os indices de shannon e guardar na lista a partir do segundo objeto desta.
    for (i in 2: nsim) #contador de 2 ao comprimento do numero de simulações.
    { 
      sx<- x[sample(nrow(x)),] # aletorizaçao das linhas do data frame
      sx2<- sample(sx) # aletorizaçao das colunas do data frame
      colnames(sx2)=colnames(x) #renomeia as colunas do data frame aleatorizado com a sequencia original contida no data frame de entrada
      rownames(sx2)=rownames(x) #renomeia as linhas do data frame aleatorizado com a sequencia original contida no data frame de entrada
      total<- apply(sx2, 1, sum,na.rm=TRUE) #soma o total por linha
      li<- sx2/total #divide cada valor da linha pelo seu total
      log.li<- li*log(li) #valores das linhas multiplicados por seu logaritimo natural
      ind.sh<- abs(apply(log.li,1, sum, na.rm=TRUE)) #soma os valores das linhas multiplicadas por seu logaritimo natural e, na sequencia converte os valores negativos.
      s.result[[i]]<- ind.sh #guarda as simulações dentro da lista "s.result"
    }
  
  if(indice =="si") # se indice igual a "si" o looping irá calcular os indices de shannon e guardar na lista a partir do segundo objeto desta.
    for(i in 2: nsim) #contador de 2 ao comprimento do numero de simulações.
    {
      sx<- x[sample(nrow(x)),] # aletorizaçao das linhas do data frame
      sx2<- sample(sx) # aletorizaçao das colunas do data frame
      colnames(sx2)=colnames(x) #renomeia as colunas do data frame aleatorizado com a sequencia original contida no data frame de entrada
      rownames(sx2)=rownames(x) #renomeia as linhas do data frame aleatorizado com a sequencia original contida no data frame de entrada
      total<- apply(sx, 1, sum,na.rm=TRUE) #soma o total por linha
      li<- sx/total  #divide cada valor da linha pelo seu total
      ind.sim<- abs(1- apply((li^2), 1, sum, na.rm=TRUE)) #calcula o indice de simpson (1- linhas dividas por sua soma e elevadas ao quadrado), na sequencia converte os valores negativos
      s.result[[i]]<- ind.sim #guarda as simulações dentro da lista "s.result"
      }
  
  if(indice=="sh") # se indice igual a "sh" 
    
  {
    sh.simul<- sapply(s.result, "[", 1: nrow(x)) #transpõe as linhas das listas em colunas
    sh.logic<- apply(sh.simul>=result, 1, sum)/nsim # faz o teste logico observando a chance de se obter aleatoriamente um valor maior ou igual ao do indice observado para cada parcela.
    p.valor<-sh.logic #guarda os valores dentro do objeto "pvalor"
  }
  
  if(indice=="si") # se indice for igual a "si"
    
  {
    sim.simul<- sapply(s.result, "[", 1: nrow(x)) #transpõe as linhas das listas em colunas
    sim.logic<- apply(sim.simul>=result, 1, sum)/nsim # faz o teste logico observando a chance de se obter aleatoriamente um valor maior ou igual ao do indice observado para cada parcela.
    p.valor<-sim.logic #guarda os valores dentro do objeto "pvalor"
  }
  
  {
    matriz.indice<- result #guarda os indices observados dentro da matriz  "matriz.indice"
    matriz.indice<- as.data.frame(matriz.indice) #transforma o objeto "matriz.indice" em um data frame
    rownames(matriz.indice)<- rownames(x) #atribui a linhas do onjeto "matriz" os nomes da linhas data frame de entrada
  }
  
  {
    matriz.p<- matrix(p.valor) #guarda os valores de p obtidos por meio das simulações no objeto "matriz.p"
    colnames(matriz.p) <- "valor-p" #Renomenia o nome da coluna do objeto
    rownames(matriz.p)<- rownames(x) #renomei as linhas com os nomes do data frame de entrada
  }
  if(indice=="sh") # se indice for igual a "sh"
  {
    m.result=apply(sh.simul,1,mean) #calcula a média dos valores observados
    interv.conf=apply(sh.simul,1,quantile,probs=c(0.025,0.975)) # calcula o IC para os valores obtidos por meio valores simulados
  }
  if(indice=="si") # se indice for igual a "si"
  {
    m.result=apply(sim.simul,1,mean) #calcula a média dos valores observados
    interv.conf=apply(sim.simul,1,quantile,probs=c(0.025,0.975)) # calcula o IC para os valores obtidos por meio valores simulados
  }
  names(m.result)=rownames(x) #atribui ao objeto "m.result" o nome das linha do data frame de entrada
  colnames(interv.conf)=rownames(x) #atribui ao objeto "interv.conf" o nome da linhas do data frame de entrada
  output<-list(s.result, matriz.indice, matriz.p, m.result, interv.conf) #retorna os valores das simulações, os valores dos indices observados, o valor de p, a média das simulações e o intervalo de confiança dos valores simulados.
  names(output)<- c("Simulações", "Indice de diversidade observado", "valor-p", "Media das simulações", "IC - simulações") #renomei os objetos retornados a partir da lista gerado no "return"
  return(output) # retorná uma lista contendo as simulações, uma matriz com valores guardados em "result", e uma segunda matriz contendo o valor de p, calculado a partir das simulações 
 }
\end{lstlisting}



\end{document}
