简言之,这个过程是个“串行”过程:先处理center=TRUE/FALSE,把处理的结果传下去给scale=TRUE/FALSE,所以center的结果会影响scale的分母。
源代码可能比文字更清楚一些吧:
> scale.default<br />
function (x, center = TRUE, scale = TRUE)<br />
{<br />
x <- as.matrix(x)<br />
nc <- ncol(x)<br />
if (is.logical(center)) {<br />
if (center) {<br />
center <- colMeans(x, na.rm = TRUE)<br />
x <- sweep(x, 2L, center, check.margin = FALSE)<br />
}<br />
}<br />
else if (is.numeric(center) && (length(center) == nc))<br />
x <- sweep(x, 2L, center, check.margin = FALSE)<br />
else stop("length of 'center' must equal the number of columns of 'x'")<br />
if (is.logical(scale)) {<br />
if (scale) {<br />
## 注意此处的f中不涉及中心化<br />
f <- function(v) {<br />
v <- v[!is.na(v)]<br />
sqrt(sum(v^2)/max(1, length(v) - 1L))<br />
}<br />
scale <- apply(x, 2L, f)<br />
## 此时的x可能已经经过前面center的处理了<br />
x <- sweep(x, 2L, scale, "/", check.margin = FALSE)<br />
}<br />
}<br />
else if (is.numeric(scale) && length(scale) == nc)<br />
x <- sweep(x, 2L, scale, "/", check.margin = FALSE)<br />
else stop("length of 'scale' must equal the number of columns of 'x'")<br />
if (is.numeric(center))<br />
attr(x, "scaled:center") <- center<br />
if (is.numeric(scale))<br />
attr(x, "scaled:scale") <- scale<br />
x<br />
}<br />
<environment: namespace:base><br />
</p>