Rev 68948 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
# File src/library/utils/R/de.R# Part of the R package, https://www.R-project.org## Copyright (C) 1995-2013 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/de.ncols <- function(inlist){ncols <- matrix(0, nrow=length(inlist), ncol=2L)i <- 1Lfor( telt in inlist ) {if( is.matrix(telt) ) {ncols[i, 1L] <- ncol(telt)ncols[i, 2L] <- 2L}else if( is.list(telt) ) {for( telt2 in telt )if( !is.vector(telt2) ) stop("wrong argument to 'dataentry'")ncols[i, 1L] <- length(telt)ncols[i, 2L] <- 3L}else if( is.vector(telt) ) {ncols[i, 1L] <- 1Lncols[i, 2L] <- 1L}else stop("wrong argument to 'dataentry'")i <- i+1L}return(ncols)}de.setup <- function(ilist, list.names, incols){ilen <- sum(incols)ivec <- vector("list", ilen)inames <- vector("list", ilen)i <- 1Lk <- 0Lfor( telt in ilist ) {k <- k+1Lif( is.list(telt) ) {y <- names(telt)for( j in seq_along(telt) ) {ivec[[i]] <- telt[[j]]if( is.null(y) || y[j]=="" )inames[[i]] <- paste0("var", i)else inames[[i]] <- y[j]i <- i+1L}}else if( is.vector(telt) ) {ivec[[i]] <- teltinames[[i]] <- list.names[[k]]i <- i+1}else if( is.matrix(telt) ) {y <- dimnames(telt)[[2L]]for( j in seq_len(ncol(telt)) ) {ivec[[i]] <- telt[, j]if( is.null(y) || y[j]=="" )inames[[i]] <- paste0("var", i)else inames[[i]] <- y[j]i <- i+1L}}else stop("wrong argument to 'dataentry'")}names(ivec) <- inamesreturn(ivec)}de.restore <- function(inlist, ncols, coltypes, argnames, args){## take the data in inlist and restore it## to the format described by ncols and coltypesp <- length(ncols)rlist <- vector("list", length=p)rnames <- vector("character", length=p)j <- 1Llnames <- names(inlist)if(p) for(i in seq_len(p)) {if(coltypes[i]==2) {tlen <- length(inlist[[j]])x <- matrix(0, nrow=tlen, ncol=ncols[i])cnames <- vector("character", ncol(x))for( ind1 in seq_len(ncols[i])) {if(tlen != length(inlist[[j]]) ) {warning("could not restore type information")return(inlist)}x[, ind1] <- inlist[[j]]cnames[ind1] <- lnames[j]j <- j+1L}if( nrow(x) == nrow(args[[i]]) )rn <- dimnames(args[[i]])[[1L]]else rn <- NULLif( any(cnames!="") )dimnames(x) <- list(rn, cnames)rlist[[i]] <- xrnames[i] <- argnames[i]}else if(coltypes[i]==3) {x <- vector("list", length=ncols[i])cnames <- vector("character", ncols[i])for( ind1 in seq_len(ncols[i])) {x[[ind1]] <- inlist[[j]]cnames[ind1] <- lnames[j]j <- j+1L}if( any(cnames!="") )names(x) <- cnamesrlist[[i]] <- xrnames[i] <- argnames[i]}else {rlist[[i]] <- inlist[[j]]j <- j+1rnames[i] <- argnames[i]}}names(rlist) <- rnamesreturn(rlist)}de <- function(..., Modes=list(), Names=NULL){sdata <- list(...)snames <- as.character(substitute(list(...))[-1L])if( is.null(sdata) ) {if( is.null(Names) ) {odata <- vector("list", length=max(1,length(Modes)))}else {if( (length(Names) != length(Modes)) && length(Modes) ) {warning("'modes' argument ignored")Modes <- list()}odata <- vector("list", length=length(Names))names(odata) <- Names}ncols <- rep.int(1, length(odata))coltypes <- rep.int(1, length(odata))}else {ncols <- de.ncols(sdata)coltypes <- ncols[, 2L]ncols <- ncols[, 1]odata <- de.setup(sdata, snames, ncols)if(length(Names))if( length(Names) != length(odata) )warning("'names' argument ignored")else names(odata) <- Namesif(length(Modes))if(length(Modes) != length(odata)) {warning("'modes' argument ignored")Modes <- list()}}rdata <- dataentry(odata, as.list(Modes))if(any(coltypes != 1L)) {if(length(rdata) == sum(ncols))rdata <- de.restore(rdata, ncols, coltypes, snames, sdata)else warning("could not restore variables properly")}return(rdata)}data.entry <- function(..., Modes=NULL, Names=NULL){tmp1 <- de(..., Modes=Modes, Names=Names)j <- 1Lnn <- names(tmp1)for(i in nn) {assign(i, tmp1[[j]], envir=.GlobalEnv)j <- j+1L}if(j == 1L) warning("did not assign() anything")invisible(nn)}