English · PDF 297
(max(x, na.rm = TRUE) - min(x, na.rm = TRUE)) #> [1] 0.289 0.751 0.000 0.678 0.853 1.000 0.172 0.611 0.612 #> [10] 0.601
这段代码有一些重复之处。我们计算了三次数据的范围,但一步完成会更合理:
rng <- range(x, na.rm = TRUE) (x - rng[1]) / (rng[2] - rng[1]) #> [1] 0.289 0.751 0.000 0.678 0.853 1.000 0.172 0.611 0.612 #> [10] 0.601
将中间计算提取到命名变量中是一种好习惯,因为它能让代码的意图更加清晰。既然我已经简化了代码,并确认它仍然可以正常工作,接下来就可以把它变成一个函数:
rescale01 <- function(x) { rng <- range(x, na.rm = TRUE) (x - rng[1]) / (rng[2] - rng[1]) } rescale01(c(0, 5, 10)) #> [1] 0.0 0.5 1.0
创建一个新函数有三个关键步骤:
注意整体流程:我是在弄清楚如何让它对简单输入生效之后,才创建这个函数的。从能运行的代码出发再将其改造成函数会更容易;而先创建函数再试图让它运行起来则更难。
此时,最好用几个不同的输入来检查你的函数:
rescale01(c(-10, 0, 10)) #> [1] 0.0 0.5 1.0 rescale01(c(1, 2, 3, NA, 5)) #> [1] 0.00 0.25 0.50 NA 1.00