Avisos e finally
Parte da seção Lógica e Fluxo do Journey de R da Coddy. Lição 54 de 64.
Um aviso relata um problema sem interromper a execução: a função retorna um valor e o R imprime o aviso ao final. as.numeric() emite um aviso para texto que não é um número e retorna NA:
x <- as.numeric("abc")
print(x)Saída:
[1] NA
Warning message:
NAs introduced by coercion Assim como os erros, os avisos vão para o fluxo de erros, portanto falham em um teste no Coddy. suppressWarnings() os silencia quando você verifica o resultado por conta própria, e tryCatch(..., warning = ) transforma um aviso em um valor:
x <- suppressWarnings(as.numeric("abc"))
print(is.na(x))
r <- tryCatch(as.numeric("abc"), warning = function(w) paste("warned:", conditionMessage(w)))
print(r)Saída:
[1] TRUE
[1] "warned: NAs introduced by coercion"warning("message") gera um aviso a partir do seu próprio código. Um manipulador para ele funciona da mesma forma que um manipulador para um erro:
ratio <- function(a, b) {
if (b == 0) warning("b is zero, returning Inf")
a / b
}
r <- tryCatch(ratio(1, 0), warning = function(w) conditionMessage(w))
print(r)Saída:
[1] "b is zero, returning Inf"finally = ... é executado após a expressão e qualquer manipulador, tenha ocorrido um erro ou não. Use-o para tarefas que sempre devem acontecer, como uma mensagem de encerramento:
load <- function(x) {
tryCatch({
if (x < 0) stop("negative")
x * 10
}, error = function(e) NA,
finally = cat("finished", x, "\n"))
}
print(load(2))
print(load(-1))Saída:
finished 2
[1] 20
finished -1
[1] NADesafio
FácilComplete to_numbers(texts). Converta cada texto em um número. Os valores que não puderem ser convertidos se tornarão NA sem que nenhum aviso seja impresso. Retorne duas linhas: Numbers: com os números convertidos unidos por espaços (incluindo os valores NA) e Invalid: com o número de valores que falharam.
O código fornecido lê os textos como uma linha separada por vírgulas e imprime cada linha retornada.
Experimente você mesmo
to_numbers <- function(texts) {
# Escreva seu código aqui
c("Numbers: ", "Invalid: 0")
}
# Código de entrada/saída fornecido: mantenha-o como está
input <- suppressWarnings(readLines(file("stdin")))
cat(to_numbers(strsplit(input[1], ",")[[1]]), 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