iv.calc package:unknown R Documentation ~~Calculadora de Valores Individuais (Pokémon)~~ Descrição: ~~ iv.calc é uma função criada para calcular os valores individuais (IVS) de seus pokémon dos jogos da geração III ~~ ~~ em diante. Como padrão, a função usa os valores base (database) da geração VII em diante. ~~ ~~ Não funciona para o Pokémon GO. ~~ Uso: ~~ iv.calc(pokemon, stats, EV, lvl, nature = "Hardy", interesse = NULL, database = base.stats) ~~ Arguments: ~~ pokemon O nome de pokémon que deseja calcular o IV. Deve vir escrito exatamente como consta o nome do ~~ ~~ pokémon no database. Pode ser um valor único ou um vetor contendo o nome de n pokémon. ~~ ~~ stats Os valores dos atributos de seus pokémon, na ordem: HP, ATK, DEF, Sp.A, Sp.D e SPD. ~~ ~~ Pode ser um vetor contendo apenas esses 6 valores, ou um data.frame contendo 6 colunas e n linhas ~~ ~~ equivalentes a cada pokémon [1 <= stats <= 714]. ~~ ~~ EV Os EVs ou valores de esforço de seus pokémon, na ordem: HP, ATK, DEF, Sp.A, Sp.D e SPD. ~~ ~~ Pode ser um vetor contendo apenas esses 6 valores, ou um data.frame contendo 6 colunas e n linhas ~~ ~~ equivalentes a cada pokémon [0 <= EV <= 252; sum(EV) < 510]. ~~ ~~ lvl O nível de seus pokémon. Pode ser um valor único ou um vetor contendo os níveis de n pokémon. ~~ ~~ [1 <= lvl <= 100]. ~~ ~~ nature A natureza de seus pokémon. Deve vir escrita da seguinte forma: "Hardy","Bashful","Adamant", etc. ~~ ~~ Também deve conter apenas os nomes das 25 possíveis naturezas dos pokémon. Pode ser um valor único ~~ ~~ ou um vetor contendo as naturezas de n pokémon. ~~ ~~ interesse Dados vários pokémon (n > 1), o usuário pode escolher um pokémon de interesse em ~~ ~~ particular para ser comparado com os demais pokémon em relação a seus IVs. Deve ser um número inteiro ~~ ~~ único de 1 a n, correspondente a posição do pokémon de interesse no vetor pokemon. ~~ ~~ database Um dataframe contendo 7 colunas, sendo a primeira coluna o nome de todos os Pokémon e as demais ~~ ~~ colunas seus atributos basais, utilizados no cálculo dos IVs, na ordem HP, ATK, DEF, Sp.A, Sp.D e SPD. ~~ ~~ Caso o usuário não forneça um database, ele é baixado diretamente da internet. ~~ Detalhes: ~~ Fórmulas usadas nessa função: ~~ ~~ Cálculo do HP: HP = ((2*ValorBasal + IV + EV/4 + 100) * Nível) / 100 + 10 ~~ ~~ Cálculo dos demais atributos: Atributo = (((2*ValorBasal + IV + EV/4) * Nível) / 100 + 5) * Natureza ~~ ~~ Caso o usuário forneça valores errados para stats, lvl, EV ou nature, a função irá rodar, porém, poderão ser ~~ ~~ criados valores impossíveis de IV impossíveis (0 <= IV <= 31). Nesse caso, o usuário receberá um aviso e a saída ~~ ~~ conterá NAs e listas vazias. ~~ ~~ Os valores de stats variam de 1 a 714 pois esses são o menor e maior valor que um pokémon pode ter. ~~ ~~ Shedinja sempre possui 1 de HP e uma Blissey com 31 de IV e 252 de EVs pode atingir 714 HP. ~~ ~~ Por esse motivo, caso os valores ultrapassem esse limite, escolhi que a função parasse automaticamente, ~~ ~~ evitando a criação de NAs mais para frente. ~~ ~~ As natureza dos pokémon entram na fórmula na forma de um multiplicador que pode assumir os valores 1.1, 1 ou 0.9 ~~ ~~ caso elas sejam respectivamente, "positivas", "neutras" ou "negativa" para determinado atributo. ~~ ~~ Por ser uma natureza neutra para todos os atributos, "Hardy" foi colocada como padrão para a função. ~~ ~~ Além de calcular os IVs dos pokémon, a função também calcula o spread de seus IVs. Isto é, os valores de IV ~~ ~~ que gerariam um valor igual ao valor do atributo do pokémon quando arredondado para zero casas decimais. ~~ ~~ Isso ocorre pois a fórmula do cálculo dos IVs gera números reais, porém os IVs podem apenas ser números inteiros. ~~ ~~ Ademais, dadas as fórmulas, quanto menor o nível dos pokémon, maior é o erro associado ao cálculo do IV. ~~ ~~ Caso sejam fornecidos n > 1 pokémon, a função possui uma saída gráfica (scatterplot), onde os valores dos ~~ ~~ IVs de cada atributo são mostrados graficamente, separados pelas cores que eles apresentam nos jogos. ~~ ~~ Ademais, a função também adiciona uma linha horizontal referente ao limiar de IVs que é considerado "muito bom" ~~ ~~ (IV >= 26). Por fim, caso o usuário forneça um pokémon de interesse em particular, este recebe destaque no gráfico ~~ ~~ e também virá com uma barra de erro referente aos valores de spread possível dos seu IVs. ~~ Value: ~~ Retorna uma de duas listas possíveis. ~~ ~~ Se pokemon tiver n = 1, ou n > 1 & interesse = NULL ~~ [[1]] IVs Medianos : Um vetor para n = 1 ou um data.frame para n > 1, contendo os IVs de cada um dos pokémon. [[2]] IV Spread - HP : Um vetor para n = 1 ou uma lista para n > 1, contendo o spread para os IVs de HP de cada um dos pokémon. [[3]] IV Spread - ATK : Um vetor para n = 1 ou uma lista para n > 1, contendo o spread para os IVs de ATK de cada um dos pokémon. [[4]] IV Spread - DEF : Um vetor para n = 1 ou uma lista para n > 1, contendo o spread para os IVs de DEF de cada um dos pokémon. [[5]] IV Spread - Sp.A : Um vetor para n = 1 ou uma lista para n > 1, contendo o spread para os IVs de Sp.A de cada um dos pokémon. [[6]] IV Spread - Sp.D : Um vetor para n = 1 ou uma lista para n > 1, contendo o spread para os IVs de Sp.D de cada um dos pokémon. [[7]] IV Spread - SPD : Um vetor para n = 1 ou uma lista para n > 1, contendo o spread para os IVs de SPD de cada um dos pokémon. ~~ Se pokemon tiver n > 1 & interesse != NULL ~~ [[1]] IVs Medianos : Um vetor para n = 1 ou um data.frame para n > 1, contendo os IVs de cada um dos pokémon. [[2]] IVs maiores : Uma lista com a posição dos pokémon no parâmetro pokemon que possuem os IVs maiores que o pokémon de interesse em cada um dos atributos. [[3]] IVs menores : Uma lista com a posição dos pokémon no parâmetro pokemon que possuem os IVs menores que o pokémon de interesse em cada um dos atributos. [[4]] IVs em spread : Uma lista com a posição dos pokémon no parâmetro pokemon que possuem os IVs dentro do intervalo de spread para o pokémon de interesse em cada um dos atributos. (Contém o próprio pokémon de interesse). Notas: ~~ O objeto de saída pode ficar extremamente poluído para um n grande de pokémon, porém, dada a natureza dos spreads, ~~ ~~ os quais são vetores de 0 até 32 posições, não era possível salvá-los em um formato que não lista. ~~ ~~ Use a indexação das listas ([[]]) acima para facilitar a vizualição. ~~ Autor: ~~ Diego Pereira Nogueira da Silva ~~ Referências: ~~ Bulbapedia: https://bulbapedia.bulbagarden.net/wiki/Individual_values ~~ Examples: ## Exemplo para 1 pokémon exemplo = iv.calc(pokemon="Bulbasaur", stats=c(110,69,60,80,80,50), EV=c(0,0,0,0,0,0), lvl=50, nature="Brave") ## Exemplo para mais de um pokémon e interesse = NULL exemplo2 = iv.calc(pokemon=c("Bulbasaur","Blissey"), stats=data.frame(HP=c(110,623),ATK=c(69,51),DEF=c(60,51),Sp.A=c(80,174),Sp.D=c(80,285),SPD=c(50,122)), EV=data.frame(EVHP=c(0,0),EVATK=c(0,0),EVDEF=c(0,0),EVSp.A=c(0,0),EVSp.D=c(0,0),EVSPD=c(0,0)), lvl=c(50,100), nature=c("Brave","Brave")) ## Exemplo para mais de um pokémon de interesse != NULL exemplo3 = iv.calc(pokemon=c("Bulbasaur","Blissey","Pikachu"), stats=data.frame(HP=c(110,623,166),ATK=c(69,51,116),DEF=c(60,51,85), Sp.A=c(80,174,110),Sp.D=c(80,285,111),SPD=c(50,122,189)), EV=data.frame(EVHP=c(0,0,50),EVATK=c(0,0,50),EVDEF=c(0,0,50), EVSp.A=c(0,0,50),EVSp.D=c(0,0,50),EVSPD=c(0,0,50)), lvl=c(50,100,75), nature=c("Brave","Brave","Hasty"), interesse=3) ## Exemplo simulando muitos pokémon a = matrix(round(runif(300,0,31)), ncol=6) b = data.frame(rep("Articuno",50)) base.stats = read.csv(url("http://ecologia.ib.usp.br/bie5782/lib/exe/fetch.php?media=bie5782:01_curso_atual:alunos:trabalho_final:diego.pereira.silva:base.stats.csv"), as.is=T) nat.mat = matrix(c(rep(1, 5),1.1,0.9,1,1,1,1.1,1,0.9,1,1,1.1,1,1,0.9,1,1.1,1,1,1,0.9,0.9,1.1,1,1,1,rep(1, 5), 1,1.1,0.9,1,1,1,1.1,1,0.9,1,1,1.1,1,1,0.9,0.9,1,1.1,1,1,1,0.9,1.1,1,1,rep(1, 5),1,1,1.1,0.9,1, 1,1,1.1,1,0.9,0.9,1,1,1.1,1,1,0.9,1,1.1,1,1,1,0.9,1.1,1,rep(1, 5),1,1,1,1.1,0.9,0.9,1,1,1,1.1, 1,0.9,1,1,1.1,1,1,0.9,1,1.1,1,1,1,0.9,1.1,rep(1, 5)), ncol=5, byrow=T, dimnames=list(c("Hardy","Lonely","Adamant","Naughty","Brave","Bold","Docile","Impish","Lax","Relaxed", "Modest","Mild","Bashful","Rash","Quiet","Calm","Gentle","Careful","Quirky","Sassy", "Timid","Hasty","Jolly","Naive","Serious"), c("ATK","DEF","Sp.A","Sp.D","SPD"))) b[,2:7] = (c(round((((2*base.stats[base.stats[,1]=="Articuno",2] + a[,1] + 0 + 100) * 100) / 100 + 10)), round((((2*base.stats[base.stats[,1]=="Articuno",3] + a[,2] + 0) * 100) / 100 + 5) * nat.mat["Calm",1]), round((((2*base.stats[base.stats[,1]=="Articuno",4] + a[,3] + 0) * 100) / 100 + 5) * nat.mat["Calm",2]), round((((2*base.stats[base.stats[,1]=="Articuno",5] + a[,4] + 0) * 100) / 100 + 5) * nat.mat["Calm",3]), round((((2*base.stats[base.stats[,1]=="Articuno",6] + a[,5] + 0) * 100) / 100 + 5) * nat.mat["Calm",4]), round((((2*base.stats[base.stats[,1]=="Articuno",7] + a[,6] + 0) * 100) / 100 + 5) * nat.mat["Calm",5]))) b[,8:13] = 0 b[,14] = 100 b[,15] = "Calm" exemplo4 = iv.calc(b[,1], b[,2:7], b[,8:13], b[,14], b[,15], interesse=25)