Índice
- O Curso R
-
- Tutoriais
-
- Apostila
-
- 6. Testes de Hipótese (em preparação!)
- Exercícios
-
- Material de Apoio
-
- Área dos Alunos
-
- Cursos Anteriores
-
IBUSP
Outras Insitutições
Linques
Visitantes
Outras Insitutições
lista_compras = function(cafe, refeicao, jaca, multiplos = 0, listasobras = NULL, listacafe, listarefeicao, listajaca){ # cria a função ### VERIFICANDO PARÂMETROS DECLARADOS # Numéricos if(is.numeric(cafe) == FALSE){ # verifica se cafe é numérico stop("cafe não é numérico") # se não for, dá um erro avisando } if(is.numeric(refeicao) == FALSE){ # verifica se refeicao é numérico stop("refeicao não é numérico") # se não, for dá um erro avisando } if(is.numeric(jaca) == FALSE){ # verifica se jaca é numérico stop("jaca não é numérico") # se não for, dá um erro avisando } if(is.numeric(multiplos) == FALSE){ # verifica se multiplos é numérico stop("multiplos não é numérico") # se não for, dá um erro avisando } # listasobras if(is.null(listasobras) == FALSE){ # verifica se foi oferecido sobras. Se foi, faz verificações adicionais if(is.data.frame(listasobras) == FALSE){ # verifica se listasobras é um data.frame stop("listasobras deve ser declarado como data.frame") # se não for, dá um erro avisando } if(ncol(listasobras) != 3){ # verifica se o número de colunas está correto stop("número de colunas incorreto em listasobras") # se não estiver, dá um erro avisando } if(is.numeric(listasobras[,2]) == FALSE){ # verifica se a segunda coluna é numérica stop("verifique a segunda coluna de listasobras") # se não for, dá um erro avisando } } # listas if(is.data.frame(listacafe) == FALSE | is.data.frame(listarefeicao) == FALSE | is.data.frame(listajaca) == FALSE){ # verifica se as listas são data.frames stop("as listas de receitas devem ser declaradas como data.frame") # se não forem, dá um erro avisando } if(ncol(listacafe) != 5 | ncol(listarefeicao) != 5 | ncol(listajaca) != 5){ # verifica se o número de colunas das listas está correto stop("número de colunas incorreto nas listas") # se não estiverem, dá um erro avisando } if(is.numeric(listacafe[,3]) == FALSE | is.numeric(listarefeicao[,3]) == FALSE | is.numeric(listajaca[,3]) == FALSE){ # verifica se a terceira coluna de cada lista é numérica stop("verifique a segunda coluna de sobras") # se não for, dá um erro avisando } ### ESCREVENDO VARIÁVEIS PARA OUTPUT lista_receitas = data.frame(matrix(ncol=2, nrow=0)) # vai acumular o nome e o preparo das receitas escolhidas colnames(lista_receitas) = c("RECEITA", "PREPARO") # nomes das colunas lista_supermercado = data.frame(matrix(ncol=3, nrow=0)) # vai ser usado como lista de compras colnames(lista_supermercado) = c("INGREDIENTE", "QUANTIDADE", "UNIDADE DE MEDIDA") # nomes das colunas lista_nao_usado = data.frame(matrix(ncol=3, nrow=0)) # para mostrar as sobras que não foi possível usar colnames(lista_nao_usado) = c("INGREDIENTE", "QUANTIDADE", "UNIDADE DE MEDIDA") # nomes das colunas ### VERIFICANDO SOBRAS # Estrutura de testes escolhida para verificar os ingredientes da lista de sobras com quantidades maiores que zero: # Verificar se existe receitas com aquele ingrediente disponíveis em cafe, refeicao, ou jaca conforme # determinado pelos parâmetros declarados # Para cada categoria de receita, identificar todas as receitas que contém o ingrediente, e verificar se tem mais ou menos # receitas do que o requisitado para aquela categoria. # Se houverem mais receitas do que o requisitado, sorteia as receitas a serem usadas. # Se foram solicitadas receitas suficientes, usar todas. # Se não houverem receitas suficientes para aquele ingrediente, incluir na lista dos ingredientes não utilizados. # Remover a quantidade do ingrediente da lista e continuar o procedimento para os demais ingredientes sobras = listasobras # atribuindo listasobras a uma nova variável para poder mexer nos valores sem perder a informação do input for(i in 1:nrow(sobras)){ # iterar sobre cada ingrediente da sobra # CAFE if(sobras[i,2] > 0){ # ver se realmente existe item disponível if(cafe > 0){ # verifica se foram solicitadas receitas da categoria cafe ingrediente_no_cafe = listacafe[listacafe$INGREDIENTE == sobras[i,1],] # procurando o ingrediente na lista de cafe if(nrow(ingrediente_no_cafe) > 0){ # ver se encontrou alguma receita pra usar o ingrediente if(cafe < nrow(ingrediente_no_cafe)){ # verifica se existem mais receitas do que o permitido para cafe sorteio = sample(1:nrow(ingrediente_no_cafe), cafe) # sorteia o número de receitas necessárias lista_receitas = rbind(lista_receitas, ingrediente_no_cafe[sorteio, c(1,5)]) # incluir receitas escolhidas na lista lista_supermercado = rbind(lista_supermercado, listacafe[listacafe$RECEITA %in% ingrediente_no_cafe[sorteio, 1], c(2, 3, 4)]) # incluir todos ingredientes das receitas sorteadas na lista de compras cafe = 0 # zerar a quantidade de receitas da categoria cafe disponíveis if(length(unique(ingrediente_no_cafe[sorteio,4])) == 1){ # verifica se unidades de medida do ingrediente são iguais sobras[i,2] = sobras[i,2] - sum(ingrediente_no_cafe[sorteio,3]) # tira o ingrediente das sobras }else{ # se unidades de medida do ingrediente não forem iguais stop("Verifique as unidades de medida da tabela cafe") # dá erro } }else{ # se tiver mais receitas cafe declaradas do que receitas com o ingrediente lista_receitas = rbind(lista_receitas, ingrediente_no_cafe[, c(1,5)]) # incluir receitas na lista lista_supermercado = rbind(lista_supermercado, listacafe[listacafe$RECEITA %in% ingrediente_no_cafe[, 1], c(2, 3, 4)]) # incluir todos ingredientes das receitas na lista de compras cafe = cafe - nrow(ingrediente_no_cafe) # diminui o número de receitas disponíveis em cafe if(length(unique(ingrediente_no_cafe[,4])) == 1){ # verifica se unidades de medida do ingrediente são iguais sobras[i,2] = sobras[i,2] - sum(ingrediente_no_cafe[,3]) # Tira o ingrediente usado das sobras }else{ # se unidades de medida do ingrediente não forem iguais stop("Verifique as unidades de medida da tabela cafe") # dá erro } } } } } # REFEIÇÃO if(sobras[i,2] > 0){ # ver se realmente existe item disponível if(refeicao > 0){ # verifica se foram solicitadas receitas da categoria refeicao ingrediente_na_refeicao = listarefeicao[listarefeicao$INGREDIENTE == sobras[i,1],] # procurando o ingrediente na lista de refeicao if(nrow(ingrediente_na_refeicao) > 0){ # ver se encontrou alguma receita pra usar o ingrediente if(refeicao < nrow(ingrediente_na_refeicao)){ # verifica se existem mais receitas do que o permitido para refeicao sorteio = sample(1:nrow(ingrediente_na_refeicao), refeicao) # sorteia o número de receitas necessárias lista_receitas = rbind(lista_receitas, ingrediente_na_refeicao[sorteio, c(1,5)]) # incluir receitas escolhidas na lista lista_supermercado = rbind(lista_supermercado, listarefeicao[listarefeicao$RECEITA %in% ingrediente_na_refeicao[sorteio, 1], c(2, 3, 4)]) # incluir todos ingredientes das receitas sorteadas na lista de compras refeicao = 0 # zerar a quantidade de receitas da categoria refeicao disponíveis if(length(unique(ingrediente_na_refeicao[sorteio,4])) == 1){ # verifica se unidades de medida do ingrediente são iguais sobras[i,2] = sobras[i,2] - sum(ingrediente_na_refeicao[sorteio,3]) # tira o ingrediente das sobras }else{ # se unidades de medida do ingrediente não forem iguais stop("Verifique as unidades de medida da tabela refeicao") # dá erro } }else{ # se tiver mais receitas refeicao declaradas do que receitas com o ingrediente lista_receitas = rbind(lista_receitas, ingrediente_na_refeicao[, c(1,5)]) # incluir receitas na lista lista_supermercado = rbind(lista_supermercado, listarefeicao[listarefeicao$RECEITA %in% ingrediente_na_refeicao[, 1], c(2, 3, 4)]) # incluir todos ingredientes das receitas na lista de compras refeicao = refeicao - nrow(ingrediente_na_refeicao) # diminui o número de receitas disponíveis em cafe if(length(unique(ingrediente_na_refeicao[,4])) == 1){ # verifica se unidades de medida do ingrediente são iguais sobras[i,2] = sobras[i,2] - sum(ingrediente_na_refeicao[,3]) # tira a quantidade do ingrediente das sobras }else{ # se unidades de medida do ingrediente forem diferentes stop("Verifique as unidades de medida da tabela refeicao") # dá erro } } } } } # PÉ NA JACA if(sobras[i,2] > 0){ # ver se realmente existe item disponível if(jaca > 0){ # verifica se foram solicitadas receitas da categoria jaca ingrediente_na_jaca = listajaca[listajaca$INGREDIENTE == sobras[i,1],] # procurando o ingrediente na lista de jaca if(nrow(ingrediente_na_jaca) > 0){ # ver se encontrou alguma receita pra usar o ingrediente if(jaca < nrow(ingrediente_na_jaca)){ # verifica se existem mais receitas do que o permitido para jaca sorteio = sample(1:nrow(ingrediente_na_jaca), jaca) # sorteia o número de receitas necessárias lista_receitas = rbind(lista_receitas, ingrediente_na_jaca[sorteio, c(1,5)]) # incluir receitas escolhidas na lista lista_supermercado = rbind(lista_supermercado, listajaca[listajaca$RECEITA %in% ingrediente_na_jaca[sorteio, 1], c(2, 3, 4)]) # incluir todos ingredientes das receitas sorteadas na lista de compras jaca = 0 # zerar a quantidade de receitas da categoria jaca disponíveis if(length(unique(ingrediente_na_jaca[sorteio,4])) == 1){ # verifica se unidades de medida do ingrediente são iguais sobras[i,2] = sobras[i,2] - sum(ingrediente_na_jaca[sorteio,3]) # tira o ingrediente das sobras }else{ # se unidades de medida do ingrediente forem diferentes stop("Verifique as unidades de medida da tabela jaca") # dá erro } }else{ # se tiver mais receitas jaca declaradas do que receitas com o ingrediente lista_receitas = rbind(lista_receitas, ingrediente_na_jaca[, c(1,5)]) # incluir receitas na lista lista_supermercado = rbind(lista_supermercado, listajaca[listajaca$RECEITA %in% ingrediente_na_jaca[, 1], c(2, 3, 4)]) # incluir todos ingredientes das receitas na lista de compras jaca = jaca - nrow(ingrediente_na_jaca) # diminui o número de receitas disponíveis em cafe if(length(unique(ingrediente_na_jaca[,4])) == 1){ # verifica se unidades de medida do ingrediente são iguais sobras[i,2] = sobras[i,2] - sum(ingrediente_na_jaca[,3]) # tira o ingrediente das sobras }else{ # se unidades de medida do ingrediente forem diferentes stop("Verifique as unidades de medida da tabela jaca") # dá erro } } } } } if(sobras[i,2] > 0){ # verificar se a quantidade do ingrediente ainda é maior que zero para adicionar a lista de ingredientes não usados lista_nao_usado = rbind(lista_nao_usado, sobras[i,]) # incluir o ingrediente, quantidade e unidade de medida na lista de não usados } } ### INCLUIR RECEITAS # cafe if(cafe > 0){ # ver se ainda precisa escolher mais receitas para cafe sorteio = sample(1:nrow(listacafe), cafe) # se sim, sortear o número necessário lista_receitas = rbind(lista_receitas, listacafe[sorteio, c(1,5)]) # incluir receitas escolhidas na lista lista_supermercado = rbind(lista_supermercado, listacafe[listacafe$RECEITA %in% listacafe[sorteio, 1], c(2, 3, 4)]) # incluir todos ingredientes das receitas sorteadas na lista de compras } # refeicao if(refeicao > 0){ # ver se ainda precisa escolher mais receitas para refeicao sorteio = sample(1:nrow(listarefeicao), refeicao) # se sim, sortear o número necessário lista_receitas = rbind(lista_receitas, listarefeicao[sorteio, c(1,5)]) # incluir receitas escolhidas na lista lista_supermercado = rbind(lista_supermercado, listarefeicao[listarefeicao$RECEITA %in% listarefeicao[sorteio, 1], c(2, 3, 4)]) # incluir todos ingredientes das receitas sorteadas na lista de compras } # jaca if(jaca > 0){ # ver se ainda precisa escolher mais receitas para jaca sorteio = sample(1:nrow(listajaca), jaca) # se sim, sortear o número necessário lista_receitas = rbind(lista_receitas, listajaca[sorteio, c(1,5)]) # incluir receitas escolhidas na lista lista_supermercado = rbind(lista_supermercado, listajaca[listajaca$RECEITA %in% listajaca[sorteio, 1], c(2, 3, 4)]) # incluir todos ingredientes das receitas sorteadas na lista de compras } ### MULTIPLICANDO AS QUANTIDADES DE UMA REFEIÇÃO PRINCIPAL PARA REFEIÇÃO MÚLTIPLA if(multiplos > 1){ # se foi declarado o numero de pessoas para refeicao multipla lista_receitas_refeicao = lista_receitas[lista_receitas$RECEITA %in% listarefeicao$RECEITA,] # encontrar as receitas da categoria refeicao na lista de receitas sorteio = sample(1:nrow(lista_receitas_refeicao), 1) # sortear uma receita multiplicacao = listarefeicao[listarefeicao$RECEITA %in% listarefeicao[sorteio, 1], c(2, 3, 4)] # cria dataframe com os ingredientes a serem multiplicados multiplicacao[,2] = lapply(multiplicacao, function(x) x * (multiplos - 1)) # multiplicar os ingredientes vezes o número de multiplos -1 pois os ingredientes já foram adicionados na lista de supermercado uma vez lista_supermercado = rbind(lista_supermercado, multiplicacao) # incluir todos ingredientes multiplicados na lista de compras # pegar ingredientes desta refeição e somar multiplos-1 vezes cada ingrediente } ### UNIFICANDO MESMOS INGREDIENTES DA LISTA DE SUPERMERCADO supermercado_exclusiva = unique(lista_supermercado$INGREDIENTE) # criar lista com cada ingrediente sem repetição. lista_supermercado_unificada = data.frame(matrix(nrow = length(supermercado_exclusiva), ncol = 3)) # criar nova dataframe para output da lista de supermercado sem repetição de ingredientes colnames(lista_supermercado_unificada) = c("INGREDIENTE", "QUANTIDADE", "UNIDADE DE MEDIDA") # nomear colunas lista_supermercado_unificada$INGREDIENTE = supermercado_exclusiva # preencher a coluna de ingredientes for(i in 1:length(supermercado_exclusiva)){ # iterar sobre cada ingrediente sem repetição quantidade = 0 # criar uma variável para acumular a quantidade do ingrediente for(j in 1:nrow(lista_supermercado)){ # olhar para cada linha da lista de supermercado com repetição if(lista_supermercado[j, 1] == supermercado_exclusiva[i]){ # procurando o ingrediente em questão if(is.na(lista_supermercado_unificada[i, 3]) == TRUE){ # ver se já tinha unidade de medida atribuída ao ingrediente lista_supermercado_unificada[i, 3] = lista_supermercado[j, 3] # se não tinha unidade de medida, pegar quantidade = quantidade + lista_supermercado[j, 2] # e somar a quantidade pra somatório final }else if(lista_supermercado_unificada[i, 3] == lista_supermercado[j, 3]){ # se ja tiver unidade de medida, ver se são iguais quantidade = quantidade + lista_supermercado[j, 2] # somar quantidades caso unidades sejam iguais }else if(lista_supermercado_unificada[i, 3] != lista_supermercado[j, 3]){ # se unidades de medida forem diferentes, dar um erro stop("Verifique as unidades de medidas. Para um mesmo ingrediente deve usar a mesma unidade de medida.") # emite o erro } } } lista_supermercado_unificada[i, 2] = quantidade # atribuir a somatória de quantidades a lista final } ### SUBTRAIR DA LISTA DE SUPERMERCADO OS ITENS DA SOBRA if(is.null(listasobras) == FALSE){ # se foi declarada listasobras for(i in 1:nrow(listasobras)){ # iterar sobre cada item das sobras if(listasobras[i, 1] %in% lista_supermercado_unificada$INGREDIENTE){ # se o item das sobras está presente na lista de compras lista_supermercado_unificada[lista_supermercado_unificada$INGREDIENTE == listasobras[i, 1], 2] = lista_supermercado_unificada[lista_supermercado_unificada$INGREDIENTE == listasobras[i, 1], 2] - listasobras[i, 2] # e subtrair a quantidade na sobra da quantidade da lista de supermercado if(lista_supermercado_unificada[lista_supermercado_unificada$INGREDIENTE == listasobras[i, 1], 2] <= 0){ # se essa subtração zerar o ingrediente lista_supermercado_unificada = lista_supermercado_unificada[!(lista_supermercado_unificada$INGREDIENTE == listasobras[i, 1]),] # remover o ingrediente da lista } } } } ### OUTPUT if(nrow(lista_receitas) != 0){ # verifica se lista de receitas tem alguma coisa dentro pra imprimir cat(paste("Receitas escolhidas e preparo (ou site que te ensina o preparo)\n\n")) # output de receitas cat(for(i in 1:nrow(lista_receitas)){ # iterar sobre cada linha do arquivo com as receitas usadas print(lista_receitas[i,])} # imprimindo cada linha , "\n\n", "==========", "\n\n") # fazer um separador bonitinho } if(nrow(lista_supermercado_unificada) != 0){ # verifica se lista de supermercado tem coisa dentro para imprimir cat(paste("Lista de compras de supermercado\n\n")) # output da lista de supermercado cat(for(j in 1:nrow(lista_supermercado_unificada)){ # iterando sobre cada linha do arquivo com os itens a ser comprados print(lista_supermercado_unificada[j,])} # imprimindo cada linha , "\n\n", "==========", "\n\n") # fazendo um separador bonitinho } if(nrow(lista_nao_usado) != 0){ # verifica se tem itens não usados nas sobras cat(paste("Sinto muito, esses ingredientes vão ficar sobrando na dispensa mais um tempo.\n\n")) # output dos não usados na sobras cat(for(k in 1:nrow(lista_nao_usado)){ # iterando sobre cada linha dos itens não usados print(lista_nao_usado[k,])} # imprimindo cada linha )} }