Ferramentas do usuário

Ferramentas do site


02_tutoriais:tutorial8:start

Diferenças

Aqui você vê as diferenças entre duas revisões dessa página.

Link para esta página de comparações

Ambos lados da revisão anterior Revisão anterior
Próxima revisão
Revisão anterior
02_tutoriais:tutorial8:start [2020/10/04 09:56]
adalardo [Testando a função]
02_tutoriais:tutorial8:start [2022/06/26 13:57] (atual)
adalardo [Testando a função]
Linha 4: Linha 4:
   * [[03_apostila:​programar_ale| Apostila]]   * [[03_apostila:​programar_ale| Apostila]]
 </​WRAP>​ </​WRAP>​
-====== 9. Tutoriais de Programação ​======+====== 9. Criando Funções Básicas ​====== 
  
 ===== Nossos Personagens ===== ===== Nossos Personagens =====
  
-{{:​02_tutoriais:​tutorial8:​pink_brain.jpg?​300 ​ |  ​}}//Pinky and the Brain//, no Brasil, **Pinky e o Cérebro**, são personagens de uma série ​ animada de televisão norte-americana. São dois ratos brancos de laboratório que utilizam os Laboratórios Acme como base para seus planos mirabolantes para dominar o mundo (sob razão nunca revelada). Pink é um rato totalmente estúpido e ingênuo enquanto o Cérebro é o gênio perverso que comanda os planos de conquista do mundo.+<WRAP center round box 60%> 
 +**__Pink & Cerebro__** ​  
 + 
 +{{youtube>​HRQtNBs8BF8}} 
 +</​WRAP>​ 
 + 
 + 
 + 
 +//Pinky and the Brain//, no Brasil, **Pinky e o Cérebro**, são personagens de uma série ​ animada de televisão norte-americana. São dois ratos brancos de laboratório que utilizam os Laboratórios Acme como base para seus planos mirabolantes para dominar o mundo (sob razão nunca revelada). Pink é um rato totalmente estúpido e ingênuo enquanto o Cérebro é o gênio perverso que comanda os planos de conquista do mundo.
  
 Cada episódio é caracterizado,​ tanto no início quanto no final, pela famosa tirada onde Pinky pergunta: "//​Cérebro,​ o que faremos amanhã à noite?//"​ e Cérebro responde: "//A mesma coisa que fazemos todas as noites, Pinky... Tentar conquistar o mundo!//"​ Cada episódio é caracterizado,​ tanto no início quanto no final, pela famosa tirada onde Pinky pergunta: "//​Cérebro,​ o que faremos amanhã à noite?//"​ e Cérebro responde: "//A mesma coisa que fazemos todas as noites, Pinky... Tentar conquistar o mundo!//"​
Linha 23: Linha 32:
 {{  :​02_tutoriais:​pink.jpg?​200 ​ |  }} {{  :​02_tutoriais:​pink.jpg?​200 ​ |  }}
  
 +
 +===== Classe Function =====
 +
 +Um objeto de função é uma classe especial de objetos no R que encapsulam algum tarefa. A função ''​function()''​ recebe algumas informações através dos seus argumentos e usa essas informações internamente para a realização do procedimento desejado. ​  O procedimento ou tarefa realizada por uma função é conduzido por um algoritmo, que nada mais é que um sequência de comandos concatenados. Quando o objeto de função é chamado, ele retorna o que os outros objetos retornam no console do R, o que foi atribuído a ele, ou seja essas linhas de comando no formato de texto. Entretanto, quando o objeto da classe ''​function''​ é chamada com os parênteses ''​( )''​ ele realiza a tarefa conduzido pelo conjunto concatenados de comandos que foram atribuídos a ele. Ao final, normalmente,​ a função retorna um **único** objeto que contém o resultado do procedimento. Para o retorno deste objeto, normalmente usamos uma outra função chamada ''​return()''​. ​   ​
  
  
 ===== FAZENDO VERSÕES PIORADAS DE FUNÇÕES EXISTENTES!!!! ===== ===== FAZENDO VERSÕES PIORADAS DE FUNÇÕES EXISTENTES!!!! =====
  
-Uma funções ​muito simples+Vamos construir algumas ​funções simples. A primeira é uma função que calcula a média de um conjunto de valores. 
 +A primeira etapa é definir qual o tipo de objetos que a função irá manipular e designar um nome a esse objeto como um argumento. No caso da média podemos definir esse objeto como um vetor numérico ''​x''​. Em seguida precisamos definir o algoritmo que será executado. Uma forma de fazer isso é através de um pseudocódigo que é a descrição literal do algoritmo.  
 +No nosso caso: 
 + 
 +<WRAP center round box 60%> 
 +**Pseudocodigo ''​media''​ ** 
 +  - recebe um vetor ''​x''​ 
 +  - soma os valores do vetor no objeto ''​soma''​ 
 +  - guarda o tamanho do vetor ''​x''​ em ''​nobs''​ 
 +  - divide ''​soma''​ por ''​nobs''​ e guarda no objeto ''​media''​ 
 +  - retorna o objeto ''​med''​ 
 +</​WRAP>​ 
 +  
 + 
 + 
 +Depois de definir o que a função conterá, precisamos abrir um  bloco de código para conter as linhas de comando que definem o algoritmo com as chaves ''​{ }''​. Em seguida colocamos as linhas de comando descritas no pseudocodigo e rodamos todo o bloco de código desde a atribuição da função a um nome para construir um objeto da classe ''​function''​ na nossa área de trabalho. ​ Rodo o código abaixo e cheque se houve a construção do objeto ''​media''​ e qual a classe desse objeto: 
  
 <code rsplus> <code rsplus>
 media <​-function(x) media <​-function(x)
  {  {
- soma=sum(x) + soma <- sum(x) 
- nobs=length(x) + nobs <- length(x) 
- media=soma/nobs + med <- soma/nobs 
- return(media)+ return(med)
  }  }
 </​code>​  </​code>​
  
 <WRAP center round tip 60%> <WRAP center round tip 60%>
-Note que a função nada mais é do que um conjunto de linhas de comando concatenadas para executar uma tarefa. A principio ​quem conhece ​as funções básicas do R já está qualificado a fazer funções mais complexas.+Note que a função nada mais é do que um conjunto de linhas de comando concatenadas para executar uma tarefa. A princípio ​quem usa as funções básicas do R já está qualificado a fazer funções mais complexas ​a partir delas.
  
 </​WRAP>​ </​WRAP>​
Linha 46: Linha 75:
 ===== Testando a função ===== ===== Testando a função =====
    
 +Para testar a função que acabamos de fazer, utilizamos ela da mesma maneira que as outras funções que usamos até agora. Com a diferença que esta não tem a documentação que as funções de pacotes precisam ter para poderem ser disponibilizadas no repositório do R. Rode os códigos abaixo para ver a sua função em atividade:
 +
 <code rsplus> <code rsplus>
  
 ls() ls()
 +class(media)
 media media
 media() media()
 +help(media)
 dados <- rnorm(20, 2, 1) dados <- rnorm(20, 2, 1)
 media(dados) media(dados)
Linha 69: Linha 102:
  
 ===== Uma função mais elaborada ===== ===== Uma função mais elaborada =====
-funcão ​padrão do R (//mean()//) não calcula a média quando há //NA//'no vetor de dados, a menos que o usuário utilize ​ o argumento ​//na.rm=TRUE//+função ​padrão do R (''​mean()''​) não calcula a média quando há ''​NA'' ​no vetor de dados, a menos que o usuário utilize ​ o argumento ​''​na.rm = TRUE''​
-Vamos construir uma função que diferente da função padrão, calcule a média na presença de //NA//'s, entretanto lance na tela uma mensagem sobre o número de //NA//'removidos do cálculo.  +Vamos construir uma função que diferente da função padrão, calcule a média na presença de ''​NA'' e imprima ​na tela uma mensagem sobre o número de ''​NA'' ​removidos do cálculo.  
-Note que é uma função com dois argumentos, que permite ao usuário tomar a decisão de remover ou não //NA//'s. Diferente da função ​//mean()// o padrão é invertido, nossa função remove ​//NA//'se nenhum argumento for mencionado. Note que vamos sobrepor o objeto anterior da classe ​//função//, chamado **media**. ​+Note que é uma função com dois argumentos, que permite ao usuário tomar a decisão de remover ou não ''​NA''. Diferente da função ​''​mean()'' ​o padrão é invertido, nossa função remove ​''​NA'' ​se nenhum argumento for mencionado. Note que vamos sobrepor o objeto anterior da classe ​''​função''​, chamado **media**. ​
  
  
 <code rsplus> <code rsplus>
-media<​-function(x,​rmNA=TRUE)  ​+media <- function(x, rmNA = TRUE)  ​
  {  {
- if(rmNA==TRUE)+ if(rmNA == TRUE)
  {  {
- dados=(na.omit(x)) + dados ​<- (na.omit(x)) 
- n.NA=length(x)-length(dados)+ n.NA ​<- length(x) - length(dados)
  cat("​\t",​ n.NA," valores NA excluídos\n"​)  cat("​\t",​ n.NA," valores NA excluídos\n"​)
  }  }
  else  else
  {  {
- dados=x+ dados ​<- x
  }  }
- soma=sum(dados) + soma <- sum(dados) 
- nobs=length(dados) + nobs <- length(dados) 
- media=soma/nobs+ media ​<- soma/nobs
  return(media)  return(media)
  }  }
Linha 102: Linha 135:
 ===== Função para calcular variância ===== ===== Função para calcular variância =====
 <code rsplus> <code rsplus>
-var.curso<​-function(x)+var.curso <- function(x)
  {  {
- media=media(x) + media ​<-media(x) 
- dados=na.omit(x)  + dados ​<- na.omit(x)  
- disvquad=(dados-media)^2 + disvquad ​<- (dados - media)^2 
- var.curso=sum(disvquad)/​(length(dados)-1)+ var.curso ​<- sum(disvquad)/​(length(dados)-1)
  return(var.curso)  return(var.curso)
  }  }
Linha 118: Linha 151:
  
   var.curso(dados)   var.curso(dados)
-  var(dados)###​ dica: veja o help dessa função "​help(var)"​ +  var(dados) ### dica: veja o help dessa função "​help(var)"​ 
-  var(dados,​na.rm=TRUE) +  var(dados, na.rm = TRUE) 
-  var(dados,​na.rm=FALSE)+  var(dados,​na.rm = FALSE)
  
 ===== Função para calcular o Índice de Dispersão ===== ===== Função para calcular o Índice de Dispersão =====
Linha 129: Linha 162:
  
 <code rsplus> <code rsplus>
-ID.curso<​-function(x)+ID.curso <- function(x)
  {  {
- id=var.curso(x)/​media(x)+ id <- var.curso(x)/​media(x)
  return(id)  return(id)
  }  }
Linha 148: Linha 181:
  
   *  Simulando Aleatório   *  Simulando Aleatório
- +<code rsplus> 
-  aleat=rpois(200,​2) +aleat <- rpois(200, 2) 
-  aleat +aleat 
 +</​code>​
   * Uniforme   * Uniforme
- +<code rsplus> 
-  unif=runif(200,​0,​4)+  unif <- runif(200, 0, 4)
   unif   unif
-  unif=round(unif,​0)+  unif <- round(unif, 0)
   unif   unif
 +</​code>​
   * Agregado   * Agregado
- +<code rsplus> 
-  agreg=round(c(runif(100,​0,​1),​runif(100,​5,​10)))+  agreg <- round(c(runif(100,​ 0, 1), runif(100, 5, 10)))
   agreg   agreg
 +</​code>​
  
   ​   ​
Linha 178: Linha 211:
 </​code>​ </​code>​
  
-<box 50red>+ 
 +<WRAP center round tip 80%>
 Quando o valor é próximo a 1 a distribuição é considerada aleatória. Isto quer dizer que que a ocorrência de cada indivíduo na parcela é indendente da ocorrência das demais. Neste caso, o número de indivíduos por parcela é descrito por uma variável Poisson, que tem exatamente a média igual à variância. Quando o valor é próximo a 1 a distribuição é considerada aleatória. Isto quer dizer que que a ocorrência de cada indivíduo na parcela é indendente da ocorrência das demais. Neste caso, o número de indivíduos por parcela é descrito por uma variável Poisson, que tem exatamente a média igual à variância.
-Podemos então fazer um teste de significância ​simulando uma distribuição Poisson com a mesma média dos dados. +Podemos então fazer um teste de hipótese ​simulando uma distribuição Poisson com a mesma média dos dados. 
-</box>+ 
 +</WRAP>
  
-===== Função para criar o teste de signficância ​do ID =====+===== Função para criar o teste de hipótese ​do ID =====
  
  
Linha 189: Linha 224:
 test.ID <- function(x, nsim=1000) test.ID <- function(x, nsim=1000)
         {          { 
- ID.curso=function(x){var(x)/​mean(x)}#​ essa função precisa das funcoes media e ID.curso + ID.curso ​<- function(x){var(x)/​mean(x)}#​ essa função precisa das funcoes media e ID.curso 
-        dados=na.omit(x) +        dados <- na.omit(x) 
- ndados=length(dados) + ndados ​<- length(dados) 
- med=mean(dados) + med <- mean(dados) 
- id=var(dados)/​med + id <- var(dados)/​med 
- simula.aleat=rpois(length(dados)*nsim,​ lambda=med) + simula.aleat ​<- rpois(length(dados)*nsim,​ lambda=med) 
- sim.dados=matrix(simula.aleat,​ncol= ndados) + sim.dados ​<- matrix(simula.aleat,​ncol= ndados) 
- sim.ID=apply(sim.dados,​1,​ID.curso) + sim.ID ​<- apply(sim.dados,​1,​ID.curso) 
- quant.ID=quantile(sim.ID,​ probs=c(0.025,​0.975)) + quant.ID ​<- quantile(sim.ID,​ probs=c(0.025,​0.975)) 
-        ​ if(id>​=quant.ID[1] & id<​=quant.ID[2])+        ​ if(id >= quant.ID[1] & id <= quant.ID[2])
  
- cat("​\n\n\n\t distribuição aleatória para alfa=0.05 \n\t ID= ",​id,"​\n\n\n"​)+ cat("​\n\n\n\t distribuição aleatória para alfa = 0.05 \n\t ID= ",​id,"​\n\n\n"​)
  }  }
  if(id < quant.ID[1]) ​  if(id < quant.ID[1]) ​
Linha 297: Linha 332:
  
 <code rsplus> <code rsplus>
-x1=rpois(20,​1) +x1 <- rpois(20, 1) 
-x2=rpois(20,​2) +x2 <- rpois(20, 2) 
-x3=rpois(20,​3) +x3 <- rpois(20, 3) 
-x4=rpois(20,​1) +x4 <- rpois(20, 1) 
-sp.oc=matrix(c(x1,​x2,​x3,​x4),​ ncol=4) +sp.oc <- matrix(c(x1,​ x2, x3, x4), ncol=4) 
-colnames(sp.oc)<​-c("​plot A", "plot B", "plot C", "plot D") +colnames(sp.oc) <- c("​plot A", "plot B", "plot C", "plot D") 
-rownames(sp.oc)<​-paste("​sp",​ c(1:20))+rownames(sp.oc) <- paste("​sp",​ c(1:20))
 str(sp.oc) str(sp.oc)
 dim(sp.oc) dim(sp.oc)
Linha 313: Linha 348:
  
 <code rsplus> <code rsplus>
-n.spp<​-function(dados)+n.spp <​-function(dados)
  {  {
- nplot=dim(dados)[2] + nplot ​<- dim(dados)[2] 
- resultados=rep(0,​nplot) + resultados ​<- rep(0,​nplot) 
- names(resultados)<​-paste("​n.spp",​ c(1:​nplot)) + names(resultados) <- paste("​n.spp",​ c(1:​nplot)) 
- dados[dados>​0]=1+ dados[dados>​0] = 1
  for(i in 1:​(dim(dados)[2]))  for(i in 1:​(dim(dados)[2]))
  {  {
- cont.sp=sum(dados[,​i]) + cont.sp ​<- sum(dados[,​i]) 
- resultados[i]=cont.sp+ resultados[i] ​<- cont.sp
  }  }
  return(resultados)  return(resultados)
Linha 335: Linha 370:
  
  
-<box red 80%>+ 
 +<WRAP center round tip 80%>
 Uma dica para entender qualquer função é rodar cada uma das linhas separadamente no console do R, na mesma sequência que aparecem e verificar os objetos intermediários criados. Quando chegar a um ciclo, pule a linha do //for()// e rode as linhas subsequentes,​ porém designe antes algum valor para o contador, no nosso exemplo //i// (tente i=2). A lógica da função //for()// é que o contador (//i//) terá um valor diferente a cada ciclo, no exemplo entre 1 até o número de colunas do objeto //dados//. Além disso, o contador pode ser usado para indexar a posição onde o resultado de cada ciclo será colocado no objeto final (//​resultados//​) Uma dica para entender qualquer função é rodar cada uma das linhas separadamente no console do R, na mesma sequência que aparecem e verificar os objetos intermediários criados. Quando chegar a um ciclo, pule a linha do //for()// e rode as linhas subsequentes,​ porém designe antes algum valor para o contador, no nosso exemplo //i// (tente i=2). A lógica da função //for()// é que o contador (//i//) terá um valor diferente a cada ciclo, no exemplo entre 1 até o número de colunas do objeto //dados//. Além disso, o contador pode ser usado para indexar a posição onde o resultado de cada ciclo será colocado no objeto final (//​resultados//​)
-</box>+</WRAP> 
   ​   ​
  
Linha 345: Linha 382:
 sim<​-function(dados) sim<​-function(dados)
  {  {
- nplot=dim(dados)[2] + nplot ​<- dim(dados)[2] 
- similar=matrix(1,​ncol=nplot,​nrow=nplot) + similar ​<- matrix(1,​ncol=nplot,​nrow=nplot) 
- rownames(similar)<​-paste("​plot",​ c(1:​nplot)) + rownames(similar) <- paste("​plot",​ c(1:​nplot)) 
- colnames(similar)<​-paste("​plot",​ c(1:​nplot)) + colnames(similar) <- paste("​plot",​ c(1:​nplot)) 
- dados[dados>​0]=1+ dados[dados>​0] = 1
  for(i in 1:nplot-1)  for(i in 1:nplot-1)
  {  {
Linha 355: Linha 392:
  for(m in m:nplot)  for(m in m:nplot)
  {  {
- co.oc=sum(dados[,​i]>​0 & dados[,​m]>​0) + co.oc ​<- sum(dados[,​i]>​0 & dados[,​m]>​0) 
- total.sp=sum(dados[,​i])+sum(dados[,​m])-co.oc + total.sp ​<- sum(dados[,​i]) + sum(dados[,​m]) - co.oc 
- similar[i,​m]=co.oc/​total.sp  + similar[i,​m] ​<- co.oc/​total.sp  
- similar[m,​i]=co.oc/​total.sp ​+ similar[m,​i] ​<- co.oc/​total.sp ​
  }  }
   
Linha 386: Linha 423:
  
  
-No linque a seguir você pode baixar o arquivo com o Pink e Cerebro... 
-{{:​02_tutoriais:​pinkycerebro.mpg|}} 
- 
- 
-** The End!** 
02_tutoriais/tutorial8/start.1601816198.txt.gz · Última modificação: 2020/10/04 09:56 por adalardo