←
PDF 297 / 520 (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
→
English · PDF 297
Original PDF page 297
中文 · 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

创建一个新函数有三个关键步骤:

    1. 你需要为函数选择一个名称。这里我使用了 rescale01,因为这个函数将向量重新缩放到 0 和 1 之间。
    1. 你需要在 function 内列出函数的输入,即参数。这里我们只有一个参数。如果有更多参数,调用形式会是 function(x, y, z)。
    1. 你要把开发好的代码放在函数的主体中,即紧跟在 function(...) 之后的 { 代码块。

注意整体流程:我是在弄清楚如何让它对简单输入生效之后,才创建这个函数的。从能运行的代码出发再将其改造成函数会更容易;而先创建函数再试图让它运行起来则更难。

此时,最好用几个不同的输入来检查你的函数:

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