Menu
Coddy logo textTech

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] NA
challenge icon

Desafio

Fácil

Complete 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")
quiz iconTeste seus conhecimentos

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

Pratique por conta própria: Compilador de R online