回顾:温度
本课属于 Coddy R 学习旅程的“面向对象编程”单元。第 6 课,共 57 课。
挑战
中等在 Temperature.R 中构建 S3 类 temperature。温度是一个带有属性 unit(C 或 F)的数字。
new_temperature(value, unit)使用stopifnot()检查类型,并返回structure(value, unit = unit, class = "temperature")。validate_temperature(x)会因unit must be C or F而停止;如果值低于 -273.15 C 或 -459.67 F,则会因below absolute zero而停止。temperature(value, unit = "C")使用as.double()转换值,将单位转为大写,并返回经过验证的温度。format.temperature()返回保留一位小数的21.5 C,而print.temperature()会打印Temperature: 21.5 C并返回invisible(x)。convert_to(t, unit)返回指定单位的温度(如果单位已经匹配,则返回相同的值)。
在每个 stop() 中都使用 call. = FALSE。提供的代码会读取行 21.5 c F(值、单位、目标单位),打印温度和转换后的温度,或者打印 error: 和错误消息。
将代码写在 Temperature.R 中。main.R 包含提供的输入/输出代码,不能修改。
亲手试试
source("Temperature.R")
# 提供的输入输出代码:保持原样。
input <- suppressWarnings(readLines(file("stdin")))
for (line in input) {
p <- strsplit(line, " ")[[1]]
result <- tryCatch({
t <- temperature(p[1], p[2])
print(t)
print(convert_to(t, p[3]))
NULL
}, error = function(e) cat("error: ", conditionMessage(e), "\n", sep = ""))
}
面向对象编程中的所有课
自己练习: R 在线编译器