fraldas.o <- read.table("fraldas.orcamento.csv", sep=",", header=T) #Crie o objeto "fraldas.o" e importe um arquivo texto de uma planilha orcamentaria das fraldas, com quantidade de fraldas por pacote e os precos cotados para cada tamanho. fraldas = function(data.inicio, data.nasc, poup, cha.fralda, inflacao, rendimento)#Cria funcao "fraldas" com os parametros "data.inicio", "data.nasc", "poup", "cha.fralda", "inflacao". { if (poup<0 ) #Verifica se "poup" foi inserido corretamente. { stop ("poup precisa ser um numero maior ou igual a 0") #Senao, interrompe a funcao e exibe mensagem para o usuario. } message ("ATENCAO! Os parametros 'data.inicio' e 'data.nasc' devem seguir o padrao DD/MM/AA") #Mensagem que sairá no output para alertar o usuario do formato data a ser utilizado. mes = round((as.Date(data.nasc, format="%d/%m/%y")-as.Date(data.inicio, format="%d/%m/%y"))/30, 0) #Converte a entrada de data para formate 'date' e divide por 30 para chegar no numero de meses que sera poupado o dinheiro para as fraldas. if(missing(inflacao)) #Caso o usuario não insira o argumento inflacao, a funcao segue. { } else #Caso insira: { taxa= 1 + (sum(rep((inflacao/100),times=mes))) #Calcula a inflacao calculada no periodo, portanto repete o valor da inflacao MENSAL pela quantidade de meses e soma esse valor. O valor 1 no comeco da equacao eh posto pois, na funcao, ira realizar uma multiplicao da inflacao pelo valor original do produto, portanto, sem o 1, ele reduziria o valor original ao inves de aumentar. } vec.preco.pac <- c((mean(as.numeric(fraldas.o[1,3:5]), na.rm=T)), (mean(as.numeric(fraldas.o[2,3:5]), na.rm=T)), (mean(as.numeric(fraldas.o[3,3:5]), na.rm=T)),(mean(as.numeric(fraldas.o[4,3:5]), na.rm=T)), (mean(as.numeric(fraldas.o[5,3:5]), na.rm=T)), (mean(as.numeric(fraldas.o[6,3:5]), na.rm=T))) #Vetor com os precos medios do pacote, dividido por tamanho. rn.md=160 #Quantidade estimada de fraldas RN que um bebe utiliza. rn.pacote = ceiling(rn.md/fraldas.o[1,2]) #Quantidade de pacotes necessarios do tamanho RN, considerando o pacote planilhado pelo usuario. p.md=440 #Quantidade estimada de fraldas P que um bebe utiliza. p.pacote = ceiling(p.md/fraldas.o[2,2]) #Quantidade de pacotes necessarios do tamanho P, considerando o pacote planilhado pelo usuario. m.md=920 #Quantidade estimada de fraldas M que um bebe utiliza. m.pacote = ceiling(m.md/fraldas.o[3,2]) #Quantidade de pacotes necessarios do tamanho M, considerando o pacote planilhado pelo usuario. g.md=1200 #Quantidade estimada de fraldas G que um bebe utiliza. g.pacote = ceiling(g.md/fraldas.o[4,2]) #Quantidade de pacotes necessarios do tamanho G, considerando o pacote planilhado pelo usuario. xg.md=720 #Quantidade estimada de fraldas XG que um bebe utiliza. xg.pacote = ceiling(xg.md/fraldas.o[5,2]) #Quantidade de pacotes necessarios do tamanho XG, considerando o pacote planilhado pelo usuario. xxg.md=480 #Quantidade estimada de fraldas XXG que um bebe utiliza. xxg.pacote= ceiling(xxg.md/fraldas.o[6,2]) #Quantidade de pacotes necessarios do tamanho XXG, considerando o pacote planilhado pelo usuario. vec.md= c(rn.md, p.md, m.md, g.md, xg.md, xxg.md)#Vetor gerado para calculo de geracao de lixo do output vec.pacote <- c(rn.pacote, p.pacote, m.pacote, g.pacote, xg.pacote, xxg.pacote) #Vetor com a quantidade de pacotes a serem comprados, dividido por tamanho. vec.pacote.n <- vec.pacote #Atribuindo a um vetor separado que sera mostrado no output. rn.sobra= (rn.pacote*fraldas.o[1,2])-rn.md #Unidades que sobrarao no ultimo pacote de RN. p.sobra= (p.pacote*fraldas.o[2,2])-p.md #Unidades que sobrarao no ultimo pacote de P. m.sobra= (m.pacote*fraldas.o[3,2])-m.md #Unidades que sobrarao no ultimo pacote de M. g.sobra= (g.pacote*fraldas.o[4,2])-g.md #Unidades que sobrarao no ultimo pacote de G. xg.sobra= (xg.pacote*fraldas.o[5,2])-xg.md #Unidades que sobrarao no ultimo pacote de XG. xxg.sobra= (xxg.pacote*fraldas.o[6,2])-xxg.md #Unidades que sobrarao no ultimo pacote de XXG. vec.sobra <- c(rn.sobra,p.sobra,m.sobra,g.sobra,xg.sobra,xxg.sobra) #Vetor com todas as sobras de fraldas do ultimo pacote, dividido por tamanho. vec.sobra <- ifelse(is.na(vec.sobra ),0,vec.sobra)#Caso o usuario não tenha inserido um dos tamanhos de fralda, retira os NA/NaN do vetor para o funcionamento correto da função. if(missing(rendimento)) #Caso o parametro rendimento nao for inserido: { poup.total = as.numeric(poup*mes) #valor total acumulado pelo usuario no periodo proposto. } else #Caso seja inserido { juros.m= 1 + (sum(rep((rendimento/100),times=mes))) #Calcula o rendimento calculada no periodo, portanto repete o valor do rendimento mensal pela quantidade de meses e soma esse valor. O valor 1 no comeco da equacao eh posto pois, na funcao, ira realizar uma multiplicao do rendimento pelo valor original poupado, portanto, sem o 1, ele reduziria o valor original ao inves de aumentar. poup.total= (as.numeric(poup*mes))*juros.m } poupanca = poup.total #Replica o objeto poup.total que estara no output como o valor total poupado de forma inalterada pela funcao. if(missing(cha.fralda))#Se o usuario nao inserir a quantidade de pessoas que ira chamar para um cha-fralda, a funcao segue normalmente. { } else #Caso insira, divide o numero de pessoas entre os tamanhos de fralda e subtrai do valor total de fraldas necessarias para comprar dos tamanhos que sao as mais usados. { tabela.cha <- rep(0,6) #Cria um vetor vazio. if(cha.fralda<30) #Com menos de 30 convidados, divide-se somente entre fraldas M e G. { pessoas.m = floor(cha.fralda/2) #Metade das pessoas levam fraldas M. Arredonda para baixo pois precisa de menos pacotes M do que G. pessoas.g = ceiling(cha.fralda/2) #Metade das pessoas levam fraldas G. Arredonda para cima pois precisa de mais pacotes G do que M. if(pessoas.m > vec.pacote[3]) #Caso a quantidade de pessoas que vão levar fralda M seja maior que a quantidade de fraldas necessária: { pessoas.g = pessoas.g+(pessoas.m-vec.pacote[3]) #Coloca o excedente de pessoas que levariam fralda M, para fraldas tamanho G. pessoas.m = vec.pacote[3] #E quantidade de pessoas que levam fralda M sera igual a quantidade necessaria de fraldas M. vec.pacote[3] = vec.pacote[3]-pessoas.m #Subtrai as fraldas M ganhas do total que seria necessario comprar. } else #Caso contrario { vec.pacote[3] = vec.pacote[3]-pessoas.m #Subtrai as fraldas M ganhas do total que seria necessario comprar. } vec.pacote[4] = vec.pacote[4]-pessoas.g #Subtrai as fraldas G ganhas do total que seria necessario comprar. tabela.cha[3] <- pessoas.m #Insere a quantidade de fraldas M a serem pedidas por tamanho tabela.cha[4] <- pessoas.g #Insere a quantidade de fraldas G a serem pedidas por tamanho } else #Se o usuario insere uma grande quantidade de pessoas (mais de 30), divide os pedidos entre os 3 tamanhos de maior uso. { pessoas.m = floor(cha.fralda/3) #1/3 das pessoas levam fraldas M. pessoas.g = ceiling(cha.fralda/3) #1/3 das pessoas levam fraldas G. Arredonda para cima pois é a mais utilizada. pessoas.p = floor(cha.fralda/3) #1/3 das pessoas levam fraldas P. if(pessoas.m > vec.pacote[3]) #Caso a quantidade de pessoas que vão levar fralda M seja maior que a quantidade de fraldas necessária: { pessoas.g = pessoas.g+(pessoas.m-vec.pacote[3]) #Coloca o excedente de pessoas que levariam fralda M, para fraldas tamanho G. pessoas.m = vec.pacote[3] #E quantidade de pessoas que levam fralda M sera igual a quantidade necessaria de fraldas M. vec.pacote[3] = vec.pacote[3]-pessoas.m #Subtrai as fraldas M ganhas do total que seria necessario comprar. } else #Caso não tenha mais pessoas do que fraldas M necessarias: { vec.pacote[3] = vec.pacote[3]-pessoas.m #Subtrai as fraldas M ganhas do total que seria necessario comprar. } if(pessoas.g > vec.pacote[4]) #Caso a quantidade de pessoas que vão levar fralda G seja maior que a quantidade de fraldas necessária: { pessoas.p = pessoas.p+(pessoas.g-vec.pacote[4]) #Coloca o excedente de pessoas que levariam fralda G, para fraldas tamanho P. pessoas.g = vec.pacote[4] #E quantidade de pessoas que levam fralda G sera igual a quantidade necessaria de fraldas G. vec.pacote[4] = vec.pacote[4]-pessoas.g #Subtrai as fraldas G ganhas do total que seria necessario comprar. } else #Caso não tenha mais pessoas do que fraldas G necessarias: { vec.pacote[4] = vec.pacote[4]-pessoas.g #Subtrai as fraldas G ganhas do total que seria necessario comprar. } if(pessoas.p > vec.pacote[2]) #Caso a quantidade de pessoas que vão levar fralda P seja maior que a quantidade de fraldas necessária: { tabela.cha[5] = pessoas.p - vec.pacote[2] #Coloca o excedente de pessoas que levariam fralda P, para fraldas tamanho XG. vec.pacote[5] = vec.pacote[5] - tabela.cha[5] pessoas.p=vec.pacote[2] #E quantidade de pessoas que levam fralda XG sera igual a quantidade necessaria de fraldas XG. vec.pacote[2] = vec.pacote[2]-pessoas.p #Subtrai as fraldas P ganhas do total que seria necessario comprar. } else #Caso não tenha mais pessoas do que fraldas P necessarias: { vec.pacote[2] = vec.pacote[2]-pessoas.p #Subtrai as fraldas P ganhas do total que seria necessario comprar. } tabela.cha[3] <- pessoas.m #Insere a quantidade de fraldas M a serem pedidas por tamanho tabela.cha[4] <- pessoas.g #Insere a quantidade de fraldas G a serem pedidas por tamanho tabela.cha[2] <- pessoas.p #Insere a quantidade de fraldas P a serem pedidas por tamanho } } rn.tot=vec.pacote[1]*(mean(as.numeric(fraldas.o[1,3:5]), na.rm=T)) #Calcula o total gasto em fraldas RN, considerando o cha-fralda caso tenha sido inserido pelo usuario. p.tot=vec.pacote[2]*(mean(as.numeric(fraldas.o[2,3:5]), na.rm=T)) #Calcula o total gasto em fraldas P, considerando o cha-fralda caso tenha sido inserido pelo usuario. m.tot=vec.pacote[3]*(mean(as.numeric(fraldas.o[3,3:5]), na.rm=T)) #Calcula o total gasto em fraldas M, considerando o cha-fralda caso tenha sido inserido pelo usuario. g.tot=vec.pacote[4]*(mean(as.numeric(fraldas.o[4,3:5]), na.rm=T)) #Calcula o total gasto em fraldas G, considerando o cha-fralda caso tenha sido inserido pelo usuario. xg.tot=vec.pacote[5]*(mean(as.numeric(fraldas.o[5,3:5]), na.rm=T)) #Calcula o total gasto em fraldas XG, considerando o cha-fralda caso tenha sido inserido pelo usuario. xxg.tot=vec.pacote[6]*(mean(as.numeric(fraldas.o[6,3:5]), na.rm=T)) #Calcula o total gasto em fraldas XXG, considerando o cha-fralda caso tenha sido inserido pelo usuario. vec.gasto.total <- round(c(rn.tot, p.tot, m.tot, g.tot, xg.tot, xxg.tot),2) #Insere os novos valores no vetor com o gasto total, dividido por tamanho. if(missing(inflacao)) { } else { vec.gasto.total = vec.gasto.total*taxa } vec.gasto.total <- ifelse(vec.gasto.total<=0,0,vec.gasto.total)#Caso algum valor seja negativo (ou seja,o usuario esta ganhando mais pacotes de um determinado tamanho do que ira usar), esse valor eh zerado, fazendo com que o usuario nao precise comprar fraldas deste tamanho. vec.gasto.total <- ifelse(is.na(vec.gasto.total),0,vec.gasto.total)#Caso o usuario não tenha inserido um dos tamanhos de fralda, retira os NA/NaN do vetor para o funcionamento correto da função. vetor.result=NULL #Cria vetor vazio que sera utilizado nas proximas etapas. grana.se=NULL #Cria vetor vazio que sera utilizado nas proximas etapas. grana.unid=NULL #Cria vetor vazio que sera utilizado nas proximas etapas. for(i in 1:6)# Ciclo que ira calcular quantas fraldas sera possivel comprar com o dinheiro poupado ate o nascimento do bebe. { if(poup.total>=0)#Se o usuario ainda tiver dinheiro: { grana.se=poup.total-vec.gasto.total[i] #subtrai o valor total gasto de determinado tamanho de fralda do valor poupado pelo usuario. vetor.result=append(vetor.result,grana.se) #Adiciona o resultado no vetor vazio criado previamente. poup.total=grana.se #Coloca o resultado da subtracao anterior no objeto que verificara se o usuario ainda possui dinheiro para continuar as compras. } if(poup.total<0) #Caso o usuario nao tenha dinheiro suficiente para comprar todas as fraldas de um determinado tamanho, o valor de 'poup.total' sera negativo. { vetor.result[i]=0 #Como valor negativo significa que o usuario ficou devendo dinheiro para comprar todas aquelas fraldas, essa posicao do vetor eh zerada e realiza a divisao para ver quantos pacotes o usuario eh capaz de comprar. grana.se = (poup.total+vec.gasto.total[i])/vec.preco.pac[i] #Recupera o valor original da posicao antes da subtracao do if anterior e faz a razao do dinheiro que ainda possui pelo numero de pacotes do tamanho em questao, buscando o valor minimo de pacotes que eh possivel comprar. grana.unid=floor(grana.se)#arredondamento para baixo, ja que o usuario nao tera dinheiro para comprar um pacote a mais para arredondar para cima. break #Ciclo para depois de realizar o if uma unica vez vez, pois o dinheiro que o usuario possui para compras acaba. } } pacotes.comprados=NULL#Criando vetor vazio for(i in 1:6) #Ciclo que verifica quantos pacotes o usuario eh capaz de comprar. { if(is.na(vetor.result[i])) #Caso alguma das linhas das fraldas seja deixada em branco (geralmente os tamanhos maiores): { break #Ignora o NA e segue. } if(vetor.result[i]>0)#Se for positivo, significa que o usuario foi capaz de comprar todos os pacotes necessarios daquele tamanho e ainda sobra dinheiro. Portanto adiciona ao vetor vazio "pacotes.comprados" a quantidade total necessaria de pacotes. { pacotes.comprados[i] = vec.pacote[i] } if(vetor.result[i]==0) #Se o valor for igual a 0, significa que o usuario nao tinha dinheiro suficiente para comprar todas as fraldas necessarias daquele tamanho. Portanto, adiciona ao vetor vazio "pacotes.comprados" a quantidade de pacotes que foi possivel comprar (calculado no for anterior). { pacotes.comprados[i]= grana.unid } } #Criando um tamanho maximo em comum para todos os vetores, para criar um data.frame sem erros. if(missing(cha.fralda)) #Se nao houver o cha-fralda: { max.len = max(length(vec.preco.pac), length(vec.gasto.total), length(vec.sobra), length(pacotes.comprados), length(vec.pacote), length(vec.pacote.n)) #Vetor com o tamanho maximo entre os objetos vec.preco.pac= c(vec.preco.pac, rep(NA, max.len-length(vec.preco.pac))) #Adiciona NA no final do vetor caso nao possua o tamanho maximo. vec.gasto.total= c(vec.gasto.total, rep(NA, max.len-length(vec.gasto.total))) #Adiciona NA no final do vetor caso nao possua o tamanho maximo. vec.pacote.n= c(vec.pacote.n, rep(NA, max.len-length(vec.pacote.n))) #Adiciona NA no final do vetor caso nao possua o tamanho maximo. vec.sobra= c(vec.sobra, rep(NA, max.len-length(vec.sobra))) #Adiciona NA no final do vetor caso nao possua o tamanho maximo. pacotes.comprados= c(pacotes.comprados, rep(0, max.len-length(pacotes.comprados))) #Adiciona NA no final do vetor caso nao possua o tamanho maximo. vec.pacote= c(vec.pacote, rep(0, max.len-length(vec.pacote))) #Adiciona NA no final do vetor caso nao possua o tamanho maximo. pacotes.faltantes = vec.pacote-pacotes.comprados #Cria vetor com quantas fraldas ainda faltam para comprar, dividida por tamanho. tabela.final= data.frame(round(vec.preco.pac,2), vec.gasto.total, vec.pacote.n, pacotes.comprados, pacotes.faltantes, vec.sobra, row.names = c("RN", "P", "M", "G", "XG", "XXG")) #Cria a tabela com todas informaces financeiras desejadas que estara no output da funcao. colnames(tabela.final) <- c("Preco medio do pacote(R$)", "Custo total dos pacotes(R$)", "Pacotes necessarios", "Pacotes comprados", "Pacotes faltantes", "Quantas unidades que sobrarao no ultimo pacote?")#Nomeia as colunas da tabela.final. } else #Se houver o cha-fralda: { max.len = max(length(vec.preco.pac), length(vec.gasto.total), length(vec.sobra), length(pacotes.comprados), length(vec.pacote), length(vec.pacote.n), length(tabela.cha)) #Vetor com o tamanho maximo entre os objetos vec.preco.pac= c(vec.preco.pac, rep(NA, max.len-length(vec.preco.pac))) #Adiciona NA no final do vetor caso nao possua o tamanho maximo. vec.gasto.total= c(vec.gasto.total, rep(NA, max.len-length(vec.gasto.total))) #Adiciona NA no final do vetor caso nao possua o tamanho maximo. vec.pacote.n= c(vec.pacote.n, rep(NA, max.len-length(vec.pacote.n))) #Adiciona NA no final do vetor caso nao possua o tamanho maximo. vec.sobra= c(vec.sobra, rep(NA, max.len-length(vec.sobra))) #Adiciona NA no final do vetor caso nao possua o tamanho maximo. pacotes.comprados= c(pacotes.comprados, rep(0, max.len-length(pacotes.comprados))) #Adiciona NA no final do vetor caso nao possua o tamanho maximo. vec.pacote= c(vec.pacote, rep(0, max.len-length(vec.pacote))) #Adiciona NA no final do vetor caso nao possua o tamanho maximo. tabela.cha= c(tabela.cha, rep(0, max.len-length(tabela.cha))) #Adiciona NA no final do vetor caso nao possua o tamanho maximo. pacotes.faltantes = vec.pacote-pacotes.comprados #Cria vetor com quantas fraldas ainda faltam para comprar, dividida por tamanho. tabela.final= data.frame(round(vec.preco.pac,2), vec.gasto.total, vec.pacote.n, tabela.cha, pacotes.comprados, pacotes.faltantes, vec.sobra, row.names = c("RN", "P", "M", "G", "XG", "XXG")) #Cria a tabela com todas informaces financeiras desejadas que estara no output da funcao. colnames(tabela.final) <- c("Preco medio do pacote(R$)", "Custo total dos pacotes(R$)", "Pacotes necessarios", "Pacotes pedidos no cha-fralda", "Pacotes comprados", "Pacotes faltantes", "Quantas unidades que sobrarao no ultimo pacote?")#Nomeia as colunas da tabela.final. } fralda.ecologica = c(1300, 750) #Custo maximo e minimo ao comprar fraldas ecologicas. custo.eco = mean(fralda.ecologica) #Media no custo de fraldas ecologicas. economia = c((sum(vec.gasto.total)-custo.eco)) #Economia feita ao comparar o gasto de fraldas descartaveis com fraldas ecologicas. lixo = (sum(vec.md)+sum(vec.sobra))*0.100 #Valor estimado em Kg de lixo produzido ao utilizar fraldas descartaveis. tabela.ecologica = data.frame(sum(vec.gasto.total), formatC(poupanca,2, format="f"), poupanca-(sum(vec.gasto.total)), formatC(custo.eco,2, format="f"), economia, lixo) #Cria a tabela com informacoes ecologicas e de economia caso opte por uma fralda ecologica. colnames(tabela.ecologica) <- c("Gasto total em fraldas(R$)", "Valor poupado(R$)","Quanto dinheiro resta/falta(R$)", "Custo de fraldas ecologicas(R$)", "Economia em comparacao com fraldas descartaveis(R$)", "Lixo estimado produzido por fraldas descartaveis(em Kg)") #Nomeia as colunas da tabela.final. my.list = list(tabela.final, tabela.ecologica) #Cria uma lista com data.frames finais. return(my.list)#retorna lista de output. }