blob: 70f683464140ebe56bc0b3151526c9d628a99eca [file] [log] [blame]
# File src/library/base/R/data.matrix.R
# Part of the R package, https://www.R-project.org
#
# Copyright (C) 1995-2012 The R Core Team
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# A copy of the GNU General Public License is available at
# https://www.R-project.org/Licenses/
data.matrix <- function(frame, rownames.force = NA)
{
if(!is.data.frame(frame)) return(as.matrix(frame))
d <- dim(frame)
rn <- if(rownames.force %in% FALSE) NULL
else if(rownames.force %in% TRUE) row.names(frame)
else {if(.row_names_info(frame) <= 0L) NULL else row.names(frame)}
for(i in seq_len(d[2L])) {
xi <- frame[[i]]
## at present is.numeric suffices, but let's be cautious
if(is.integer(xi) || is.numeric(xi)) next
if(is.logical(xi) || is.factor(xi)) {
frame[[i]] <- as.integer(xi)
next
}
frame[[i]] <- if(isS4(xi)) methods::as(xi, "numeric") else as.numeric(xi)
}
## it makes sense to find the type needed first.
intOK <- all(unlist(lapply(frame, is.integer)))
x <- matrix(if(intOK) NA_integer_ else NA_real_,
nrow = d[1L], ncol = d[2L],
dimnames = list(rn, names(frame)) )
for(i in seq_len(d[2L])) x[, i] <- frame[[i]]
x
}