# TODO: Add comment
# 
# Author: E. Korsching  2024
###############################################################################



list.names.content.2.df <- function(x){
	# convert list with named elements to column 1 (char) and
	#  vector content to column 2 (char)
	# function does not provide checks (!)
	name <- names(x)
	x.len <- length(x)
	elem <- vector("character",x.len)
	for(i in 1:x.len){
		elem[i] <- paste(x[[i]], collapse="; ")
	}
	erg <- data.frame(names=name, context=elem, row.names=name, stringsAsFactors=F)
	return(erg)
}
# list.names.content.2.df( x=list(an=c("aa","bb"), bn=c("cc")) )


list2mat <- function(x, rows=F, rangeL=NULL){
	# list to matrix
	# checks if all elements are of same vector size
	# rows: F: in columns, T: in rows
	# rangeL : pick a certain range of list elements : vector of positions
	if(is.null(rangeL)){
		nc <- length(x)
		ncv <- 1:nc
	}else{
		nc <- length(rangeL)
		ncv <- rangeL
	}
	# check
	if(nc==0 | is.null(nc)){ stop("No list elements")}
	if(!is.vector(x[[1]])){ stop("(first) list element not a vector")}
	nc.l <- length(x[[1]])
	tmp.v1 <- vector("logical",nc)
	for(i in ncv){
		tmp.v1[i] <- nc.l != length(x[[i]])
	}
	l1 <- sum(tmp.v1)
	if(l1>0){ stop(paste("Not all vecotors (",l1,") have the same length",sep="")) }
	
	# names
	if(is.null(names(x))){
		xnames <- as.character( seq(1,nc) )
	}else{
		xnames <- names(x)[ncv]
		#cat("\nNames : \n",xnames,"\n")
	}
	
	if(rows){
		jj <- NULL
		for(i in ncv){
			jj <- rbind( jj, unlist(x[[i]]) )
		}
		dimnames(jj)[[1]] <- xnames
	}else{
		jj <- NULL
		for(i in ncv){
			jj <- cbind( jj, unlist(x[[i]]) )
		}
		dimnames(jj)[[2]] <- xnames
	}
	return(jj)
}


list2df <- function(x, rangeL=NULL){
	# list to data.frame
	# checks if all elements are of same vector size
	# rangeL : pick a certain range of list elements : vector of positions
	if(is.null(rangeL)){
		nc <- length(x)
		ncv <- 1:nc
	}else{
		nc <- length(rangeL)
		ncv <- rangeL
	}
	
	if(nc==0 | is.null(nc)){ stop("No list elements")}
	cat("\nnumber of vectors ",nc)
	
	# check
	if(!is.vector(x[[1]])){ stop("(first) list element not a vector")}
	nc.l <- length(x[[1]])
	cat("\nlength of first vector ",nc.l)
	
	tmp.v1 <- vector("logical",nc)
	for(i in ncv){
		tmp.v1[i] <- nc.l != length(x[[i]])
	}
	l1 <- sum(tmp.v1)
	if(l1>0){ stop(paste("Not all vecotors (",l1,") have the same length",sep="")) }
	
	# names
	if(is.null(names(x))){
		xnames <- as.character( seq(1,nc) )
	}else{
		xnames <- names(x)[ncv]
		#cat("\nVector names : \n",xnames,"\n")
	}
	
	if(nc==1){
		tmp2 <- data.frame(unlist(x[[1]]), stringsAsFactors=F)
	}
	if(nc==2){
		tmp2 <- data.frame(unlist(x[[1]]), unlist(x[[2]]), stringsAsFactors=F)
	}
	if(nc>=3){
		tmp2 <- data.frame(unlist(x[[1]]), unlist(x[[2]]), stringsAsFactors=F)
		for(i in (ncv[3]:ncv[nc])){
			tmp2 <- data.frame(tmp2, unlist(x[[i]]), stringsAsFactors=F)
		}
	}
	names(tmp2) <- xnames
	return(tmp2)
}


veclist2column <- function(x, cname=""){
	# list of different sized vectors to one data.frame column
	nc <- length(x)
	ncv <- 1:nc
	
	if(nc==0 | is.null(nc)){ stop("No list elements")}
	cat("\nNumber of vectors ",nc,"\n")
	
	# check
	if(!is.vector(x[[1]])){ stop("(first) list element not a vector")}
	
	# transform
	tmp <- data.frame(matrix("",nc,1), stringsAsFactors=F)
	for(i in ncv){
		tmp[i,1] <- paste(unlist(x[[i]]), collapse=",")
	}
	
	names(tmp) <- cname
	return(tmp)
}




