frame.cvt <-
function(x, as.is=FALSE)
{
	if(!as.is && (is.character(x) || is.logical(x)))
		x <- factor(x)
	x
}

data.frame <- 
function (..., row.names=NULL, col.names=NULL, as.is=FALSE)
{
	frame <- list(...)
	n <- length(frame)
	as.is <- rep(as.is, length=n)
	for(i in 1:n) {
		as.is.i <- attr(frame[[i]], "AsIs")
		if(!is.null(as.is.i))
			as.is[i] <- as.is.i
	}
	if (is.null(col.names)) {
		v <- substitute(list(...))[-1]
		for (i in 1:length(v)) if (!is.symbol(v[[i]])) 
			v[[i]] <- paste("X", i, sep="")
		arg.names <- as.character(v)
		col.names <- names(frame)
		if (is.null(col.names)) 
			col.names <- arg.names
		else {
			nameless <- (nchar(col.names) == 0)
			col.names[nameless] <- arg.names[nameless]
		}
	}
	names(frame) <- as.character(col.names)
	for (i in 1:length(frame)) {
		if (is.list(frame[[i]])) 
			for (j in 1:length(frame[[i]])){
				if (!is.numeric(frame[[i]][[j]]) && !is.factor(frame[[i]][[j]]))
					frame[[i]][[j]] <- frame.cvt(frame[[i]][[j]], as.is=as.is[i])
		}
		else {
			if (!is.numeric(frame[[i]]) && !is.factor(frame[[i]]))
				frame[[i]] <- frame.cvt(frame[[i]], as.is=as.is[i])
		}
	}
	.Internal(data.frame(frame, as.character(row.names), as.logical(as.is)))
}

row.names <- function(x) attr(x,"row.names")

"row.names<-" <- function(x,value) {
	if( !is.data.frame(x) )
		return(data.frame(x, row.names=value))
	else
		attr(x,"row.names") <- as.character(value)
	x
}

"is.na.data.frame" <-
function (x) 
{
        y <- do.call("cbind", lapply(x, "is.na"))
        rownames(y) <- row.names(x)
        y
}

I <- function(x) {
	attr(x,"AsIs") <- TRUE
	x
}

plot.data.frame <- 
function (x, ...) 
{
	if (!is.data.frame(x)) 
		stop("plot.data.frame applied to non data frame")
	x <- data.matrix(x)
	if (ncol(x) == 1) {
		stripplot(x, ...)
	}
	else if (ncol(x) == 2) {
		plot(x, ...)
	}
	else {
		pairs(x, ...)
	}
}

t.data.frame<- function(x)
{
	x <- as.matrix(x)
	NextMethod("t")
}   

as.data.frame <- function(x, row.names = NULL, optional = F, ...) 
	UseMethod("as.data.frame") 

