[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