Validando a Entrada
Parte da seção Lógica e Fluxo do Journey de R da Coddy. Lição 55 de 64.
A entrada de usuários ou de arquivos é texto e pode ser qualquer coisa. Verifique-a antes de usá-la: suppressWarnings(as.numeric(s)) fornece NA para textos que não são números, e is.na() testa isso:
read_age <- function(s) {
n <- suppressWarnings(as.numeric(s))
if (is.na(n)) return("not a number")
if (n < 0 || n > 130) return("out of range")
paste("age", n)
}
print(read_age("36"))
print(read_age("abc"))
print(read_age("200"))Saída:
[1] "age 36"
[1] "not a number"
[1] "out of range"Um validador pode coletar todos os problemas em vez de parar no primeiro, o que fornece um feedback mais útil. Aqui, ele retorna um vetor de mensagens, vazio quando a entrada está correta:
check_password <- function(p) {
problems <- c()
if (nchar(p) < 8) problems <- c(problems, "too short")
if (!grepl("[0-9]", p)) problems <- c(problems, "needs a digit")
problems
}
print(check_password("abc"))
print(length(check_password("secret123")))Saída:
[1] "too short" "needs a digit"
[1] 0Escolha o estilo com base em quem chama a função: retorne uma mensagem quando o chamador espera uma entrada inválida e a mostra ao usuário; gere um erro com stop() quando uma entrada inválida significa um erro no programa que não deve passar despercebido.
# o chamador espera entrada inválida e mostra a mensagem
read_age("abc") # "not a number"
# entrada inválida é um erro no programa
if (!is.numeric(x)) stop("x must be numeric")Validar usando tryCatch() ao redor da etapa de análise mantém o código principal livre de verificações: cada registro é convertido ou relatado:
parse_record <- function(line) {
parts <- strsplit(line, ",")[[1]]
if (length(parts) != 2) stop("expected 2 fields")
qty <- suppressWarnings(as.integer(parts[2]))
if (is.na(qty)) stop("quantity is not a whole number")
list(item = parts[1], qty = qty)
}
for (line in c("tea,2", "jam", "oil,x")) {
r <- tryCatch(parse_record(line), error = function(e) conditionMessage(e))
cat(line, ":", if (is.list(r)) paste("ok", r$qty) else r, "\n")
}Saída:
tea,2 : ok 2
jam : expected 2 fields
oil,x : quantity is not a whole number Desafio
FácilComplete check_signup(name, age, email). Colete todos os problemas, nesta ordem: name is empty (depois de remover os espaços nas extremidades), age must be a number, age must be 13 or older (somente quando a idade for um número) e email needs @. Retorne ok quando não houver nenhum problema; caso contrário, retorne os problemas unidos por ; .
O código fornecido lê o nome, a idade e o e-mail (um por linha) e imprime o valor retornado.
Experimente você mesmo
check_signup <- function(name, age, email) {
# Escreva seu código aqui
"ok"
}
# Código de entrada/saída fornecido: mantenha-o como está
input <- suppressWarnings(readLines(file("stdin")))
cat(check_signup(input[1], input[2], input[3]), sep = "\n")
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Lógica e Fluxo
1Strings em Profundidade
Substrings com substr()Formatação com sprintf()Dividindo e UnindoPesquisando StringsSubstituindo TextoRecapitulação - Criador de Nome de Usuário4Matrizes
Criando MatrizesIndexando MatrizesResumos de Linhas e ColunasAritmética de MatrizesRecapitulação - Tabela de Assentos10Fluxo de Controle Avançado
A Função switch()ifelse() Vetorizadorepeat e breakFunções RecursivasRevisão — Classificador de Notas2Consultas de Chave-Valor
Consultas em Vetores NomeadosVerificando ChavesAdicionando e Removendo ChavesPercorrendo NomesRecapitulação - Mesa de Ações5Projeto - Boletim de Notas
Adicionando AlunosRegistrando Notas8Ordenação e Agrupamento
Ordenando VetoresOrdenando por uma ChaveAgrupando com split()Resumos de GruposRecapitulação - Tabela de Classificação11Tratamento de Erros
Gerando Erros com stop()Capturando com tryCatch()Avisos e finallyValidando a EntradaRecapitulação - Calculadora Segura3Conjuntos e Contagem
Valores ÚnicosOperações com ConjuntosTestes de PertinênciaContagem com table()Recapitulação - Convidados do Evento6Funções como Valores
Funções AnônimasPassando FunçõesRetornando FunçõesClosures com EstadoRecapitulação - Regras de Desconto9Data Frames
Criando Data FramesColunas e LinhasFiltrando LinhasAdicionando e OrdenandoRecapitulação - Relatório de Vendas12Projeto - Rastreador de Despesas
Registro de DespesasGastos TotaisPratique por conta própria: Compilador de R online