[R-br] Script com for() e if {} else{}

Thiago V. dos Santos thi_veloso em yahoo.com.br
Quarta Maio 18 17:11:09 BRT 2016


Obrigado por postar um exemplo 100% reprodutível junto da pergunta (incluindo os dados).

Pelo que entendi, a lógica das condições está certa. O problema, contudo, parece ser que certas variáveis parece nunca serem calculadas. 

Vamos seguir a lógica do programa usando o primeiro valor de i, que é igual a 2.

Primeiro, o R vai avaliar se P.ETP é menor do que zero. Essa condição NÃO é verdadeira, pois ele vale 8.99, portanto o R pula o "core" desse if e vai para o else.

O else implica que P.ETP é maior ou igual a zero, o que é verdade para a segunda linha dos dados (lembre-se do 8.99). Sendo assim, o R entra no "core" do else.

Aí começa o problema:

a$ARMf[i] = ifelse(a$ARMi[i] > cad, cad, a$ARMi[i-1])

No código acima, você está pedindo para o R comparar o valor de ARMi com o valor de cad, mas o problema é que ARMi nessa linha é um NA, e portanto essa comparação sempre resulta em NA. Sendo assim, ARMf não será calculado e nem ARMi e NAc, que dependem de ARMf. Talvez você quisesse comparar o ARMi da linha anterior?

Agora vamos avançar para a linha 5 dos dados, onde E.ETP é negativo e portanto o R entra no core da primeira condição.

Veja a segunda linha da primeira condição:

a$ARMi[i] = (cad*exp(-1*((abs(a$NAc[i]))/cad)))

No código acima, você pede para o R determinar o valor de ARMi usando o valor de NAc (que é sempre NA porque nunca foi calculado - veja o erro da primeira condição). Portanto, a resposta da exponencial também será NA. Talvez você quisesse pegar NAc da linha anterior (i-1)?

A lógica do programa está certa, mas ele sempre calcula variáveis a partir de outras variáveis que são NA por razões diversas.
Greetings,
 -- Thiago V. dos Santos

PhD student
Land and Atmospheric Science
University of Minnesota


On Wednesday, May 18, 2016 1:43 PM, Yury Duarte <yurynepomuceno em gmail.com> wrote:



Boa tarde colegas programadores, como vão?

Estou tendo alguma dificuldade em acertar o script para executar o calculo do balanço hídrico de Thornthwaite & Mather, mas para uma escala diária.
Tenho essas condições que deve ser obedecida para execução dos cálculos:
    * Se P - ETP < 0:

NAc = (P - ETP) + NAc[i-1]

ARM = CAD * exp(NAc/CAD)
    * Se P - ETP >= 0:ARM = (P - ETP) + ARM[i-1]
NAc = CAD * Ln(ARM/CAD)

    * ARM <= CAD
Utilizei o comando for e o if else para estabelecer as condições e calcular cada variável para cada dia do período analisado. Entretanto, o script não está calculando as variáveis e retorna os vetores vazios.
Segue o script no corpo do email e os dados de entrada em anexo.
Agradeço de antemão a ajuda de todos!

Abs

#----------Remover Objetos----------#
rm(list = ls())

#----------Selecionar arquivo de interesse----------#
a = read.table("x.txt", sep = "\t", header = T); head(a)


#----------Iniciar o BH----------#
a$P.ETP = a$RAIN-a$ETP.Penman
cad = 100
a$NAc = NA
a$ARMi = NA
a$ARMf = NA
a$ALT = NA
a$ETR = NA
a$DEF = NA
a$EXC = NA
head(a)

a$NAc[1] = 0
a$ARMi[1] = cad
a$ARMf[1] = cad
a$ALT[1] = 0

for(i in 2:length(a[,1])){
      if(a$P.ETP[i]<0){ 
        (a$NAc[i] = a$P.ETP[i]+a$NAc[i-1]) 
        a$ARMi[i] = (cad*exp(-1*((abs(a$NAc[i]))/cad)))
    }else{
      a$ARMf[i] = ifelse(a$ARMi[i] > cad, cad, a$ARMi[i])
      a$ARMi[i] = a$ARMf[i-1]+a$P.ETP[i]
      a$NAc[i] = cad*log((a$ARMf[i])/cad)
    }
   
  a$ALT[i] = a$ARMf[i] - a$ARMf[i-1]
  a$ETR[i] = if(a$P.ETP[i]<0){a$RAIN[i]+abs(a$ALT[i])} else{a$ETP.Penman[i]} 
  a$DEF[i] = a$ETP.Penman[i] - a$ETR[i]
  a$EXC[i] = a$ARMi[i] - a$ARMf[i]
  }

View(a)


Yury Duarte
Engenheiro Agrônomo - ESALQ/USP

_______________________________________________
R-br mailing list
R-br em listas.c3sl.ufpr.br
https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forne� c�igo m�imo reproduz�el.


Mais detalhes sobre a lista de discussão R-br