# File src/library/base/R/data.matrix.R # Part of the R package, http://www.R-project.org # # 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 # http://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 }