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]]

