wt_mean <- function(x, w) { sum(x * w) / sum(x) } wt_var <- function(x, w) { mu <- wt_mean(x, w) sum(w * (x - mu) ^ 2) / sum(w) } wt_sd <- function(x, w) { sqrt(wt_var(x, w)) }
如果 x 和 w 的长度不相同会发生什么?
wt_mean(1:6, 1:3) #> [1] 2.19
在这个例子中,由于 R 的向量循环规则,我们不会得到错误。
检查重要的前置条件,并在条件不满足时抛出错误(使用 stop())是一种好的做法:
wt_mean <- function(x, w) { if (length(x) != length(w)) { stop("x 和 w 的长度必须相同", call. = FALSE) } sum(w * x) / sum(x) }
注意不要做得太过分。在让函数变得健壮所花费的时间与编写函数所花费的时间之间存在权衡。例如,如果你还添加了 na.rm 参数,我可能不会仔细检查它:
wt_mean <- function(x, w, na.rm = FALSE) { if (!is.logical(na.rm)) { stop("na.rm 必须是逻辑值") } if (length(na.rm) != 1) { stop("na.rm 的长度必须为 1") } if (length(x) != length(w)) { stop("x 和 w 的长度必须相同", call. = FALSE) } if (na.rm) { miss <- is.na(x) | is.na(w) x <- x[!miss] w <- w[!miss] } sum(w * x) / sum(x) }