csys.get.classifiers <- function(train, labels, algo.names = NULL, algos, ...)
{
    if(nrow(train) != length(labels)) {
        stop("The number of samples is diff. with the number of labels")
    }

    if(length(algo.names) == 0) {
        algo.names = as.vector(algos[,]$name)
    }

    cas = NULL
    for(i in 1 : length(algo.names)) {
        flag = FALSE
        name = algo.names[i]
        names = as.vector(algo.names[,]$name)
        ca = NULL
        for(j in 1 : nrow(algos)) {
            if (name == names[j]) {
                algo = algos[j,]
                ## load package
                if (do.call("require",list(algo$package)) == FALSE) {
                    stop("Failed to load package: ", algo$package)
                }

                ## call algorithm function
                func.name = algo$func.name
                t.data = train
                t.labels = labels

                if (as.logical(algo$cbind)) {
                    t.data = cbind(labels,train)
                }
                if (as.logical(algo$data.frame)) {
                    t.data = data.frame(t.data)
                }
                if (algo$labels.formula.left != "" |
                    algo$labels.formula.right != "")
                {
                    t.labels = paste(c(toString(algo$labels.formula.left),toString(algo$labels.formula.right)), collapse = " ~ ")
                }


                ## parameter list
                par.list = vector("list", 2)
                names(par.list) = c(toString(algo$train.name), toString(algo$labels.name))

                par.list[[toString(algo$train.name)]] = t.data
                par.list[[toString(algo$labels.name)]] = t.labels

                if (as.logical(algo$pass.arguments)) {
                    par.list = c(par.list, ...)
                }

                ca = do.call(toString(func.name), par.list)
                flag = TRUE
            }
        }

        if (flag == FALSE) {
            cat(name, " is not a supported algorithm\n")
        }
        else {
            cas = c(cas,list(name = ca))
        }
    }
    return(cas)
}
