I suggest adding a 'pivot' argument to qr.R, to obtain columns in the
same order as the original x, so that
a <- qr(x)
qr.Q(a) %*% qr.R(a, pivot=TRUE)
returns x.
--------------------------------------------------
# File src/library/base/R/qr.R
qr.R <- function(qr, complete = FALSE, pivot = FALSE)
{
# Args:
# qr: a QR decomposition, produced by qr()
# complete: logical, if TRUE then return all columns
# pivot: logical, if TRUE then columns of the result are permuted to
# be in the same order as the original x.
if (!is.qr(qr))
stop("argument is not a QR decomposition")
R <- qr$qr
if (!complete)
R <- R[seq.int(min(dim(R))), , drop = FALSE]
R[row(R) > col(R)] <- 0
if(pivot)
R <- R[, order(qr$pivot)]
R
}
--------------------------------------------------
% File src/library/base/man/qraux.Rd
qr.R(qr, complete = FALSE, pivot = FALSE)
\item{pivot}{logical expression of length 1. If \code{TRUE},
then columns of the result are permuted to be in the same order
as the original \code{x}.}
zapsmall(qr.R(a)) # columns are int b1 c1 c2 b2 c3
zapsmall(qr.R(a, pivot = TRUE)) # columns are int b1 b2 c1 c2 c3
[[alternative HTML version deleted]]