# TODO: Add comment
# 
# Author: E.Korsching 10.9.2009
###############################################################################



pos.max.min <- function(x, flag="max")
{
	# finds the position of the maximum 'max' or minimum 'min' in
	#   a matrix/data.frame column  or  a vector
	# result:  list(value, data_type)
	#          value,row,column[,row,column]
	#          value,position[,position]
	#          ([..] if rank ties)
	result <- NULL
	if(is.matrix(x) | is.data.frame(x)){
		nr <- nrow(x)
		x <- as.matrix(x)
		if(flag=="max"){
			position <- seq(1,length(x))[x == max(x)]
		}
		if(flag=="min"){
			position <- seq(1,length(x))[x == min(x)]
		}
		column <- position%/%nr
		row <- position-column*nr
		column <- column+1
		if(flag=="max"){
			return(list(value=max(x), x=row, y=column, datatype="2d"))
		}
		if(flag=="min"){
			return(list(value=min(x), x=row, y=column, datatype="2d"))
		}
	}
	if(is.vector(x)){
		if(flag=="max"){
			position <- seq(1,length(x))[x == max(x)]
			return(list(value=max(x), x=position, datatype="vec"))
		}
		if(flag=="min"){
			position <- seq(1,length(x))[x == min(x)]
			return(list(value=min(x), x=position, datatype="vec"))
		}
	}
	if(is.null(result)){ stop("\nno result") }
}


#pos.max.min(c(2,3,9,6,7,9,1,2),flag="max")
#pos.max.min(c(2,3,9,6,7,9,1,2),flag="min")
#pos.max.min(c(F,F,T,F,F,F,F,F))

#pos.max.min(as.matrix(cbind(c(2,1,3,9,3,4,1,2),c(2,3,9,6,7,3,1,2))))
#pos.max.min(as.data.frame(cbind(c(2,1,3,9,3,4,1,2),c(2,3,9,6,7,3,1,2))))

#pos.max.min(as.matrix(cbind(c(2,1,3,9,3,4,1,2),c(2,3,8,6,7,3,1,2))))



