Menu
CoddyTech

警告与 finally

本课属于 Coddy R 学习旅程的“逻辑与流程”单元。第 54 课,共 64 课。

警告会报告问题,但不会停止运行:函数会返回一个值,R 会在最后打印警告。对于不是数字的文本,as.numeric()会发出警告并返回NA:

x <- as.numeric("abc")
print(x)

输出:

[1] NA
Warning message:
NAs introduced by coercion 

和错误一样,警告会输出到错误流,因此在 Coddy 上会导致测试失败。suppressWarnings() 会在你自行检查结果时屏蔽警告,而 tryCatch(..., warning = ) 会将警告转换为一个值:

x <- suppressWarnings(as.numeric("abc"))
print(is.na(x))
r <- tryCatch(as.numeric("abc"), warning = function(w) paste("warned:", conditionMessage(w)))
print(r)

输出:

[1] TRUE
[1] "warned: NAs introduced by coercion"

warning("message") 会从你自己的代码中发出警告。处理警告的处理程序与处理错误的处理程序工作方式相同:

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)

输出:

[1] "b is zero, returning Inf"

finally = ... 会在表达式和任何处理程序之后运行,无论是否发生错误。你可以用它来执行必须始终进行的操作,例如显示结束消息:

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))

输出:

finished 2 
[1] 20
finished -1 
[1] NA
challenge icon

挑战

简单

补全 to_numbers(texts)。将每段文本转换为数字。无法转换的值变为 NA,且不打印任何警告。返回两行:Numbers: 后跟用空格连接的转换结果(包括 NA 值),以及 Invalid: 后跟转换失败的值的数量。

提供的代码会将文本作为逗号分隔的一行读取,并打印返回的每一行。

亲手试试

to_numbers <- function(texts) {
  # 在这里编写你的代码
  c("Numbers: ", "Invalid: 0")
}

# 提供的输入和输出代码:保持原样
input <- suppressWarnings(readLines(file("stdin")))
cat(to_numbers(strsplit(input[1], ",")[[1]]), sep = "\n")
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: R 在线编译器