前置知识
本章的重点是使用 base R 编写函数,因此你不需要任何额外的包。
什么时候应该编写函数?
每当你复制并粘贴同一段代码超过两次(即你现在有三份相同的代码)时,就应该考虑编写一个函数。例如,看看这段代码。它的作用是什么?
df <- tibble::tibble( a = rnorm(10), b = rnorm(10), c = rnorm(10), d = rnorm(10) ) df$a <- (df$a - min(df$a, na.rm = TRUE)) / (max(df$a, na.rm = TRUE) - min(df$a, na.rm = TRUE)) df$b <- (df$b - min(df$b, na.rm = TRUE)) / (max(df$b, na.rm = TRUE) - min(df$a, na.rm = TRUE)) df$c <- (df$c - min(df$c, na.rm = TRUE)) / (max(df$c, na.rm = TRUE) - min(df$c, na.rm = TRUE)) df$d <- (df$d - min(df$d, na.rm = TRUE)) / (max(df$d, na.rm = TRUE) - min(df$d, na.rm = TRUE))
你或许能琢磨出这段代码是将每一列重新缩放到 0 到 1 的范围。但你是否发现了其中的错误?我在复制粘贴 df$b 的代码时犯了一个错误:我忘记把一个 a 改成 b。将重复的代码提取到函数中是一个好主意,因为它可以防止你犯这类错误。
要编写一个函数,你首先需要分析代码。它有多少个输入?
(df$a - min(df$a, na.rm = TRUE)) / (max(df$a, na.rm = TRUE) - min(df$a, na.rm = TRUE))
这段代码只有一个输入:df$a。(如果你对 TRUE 不是输入感到惊讶,可以在接下来的练习中探究原因。)为了让输入更清晰,一个好方法是使用具有通用名称的临时变量重写代码。这里这段代码只需要一个数值向量,所以我将其命名为 x:
x <- df$a (x - min(x, na.rm = TRUE)) /