R/mergeLists.R

Defines functions twMergeLists

Documented in twMergeLists

twMergeLists <- function(
    ### Recursively merge a list or vector to another list or vector
    dest        ##<< list or vector that values are merged to
    , source    ##<< list or vector that values are taken from
    , level=0   ##<< level of recursion, used internally
){
    ##seealso<< \link{twMisc}
    #
    ##details<< 
    ## Values of source are appended to dest or overwrite values in dest.
    ## If an item is a vector or a list itself, the item is merged recursively. 
    #
    #recover()
    #if( level > 0 ) recover()
    if( 0==length(source) ) source=list()
    if( 0==length(dest) ) 
        return(source)
    if( 0==length(names(source)) && 0 != length(source) )
        if( 0==length(names(dest)) && length(dest)==length(source) ){
            return(source)
        }else{
            stop("mergeLists: need to provide names for the source list")
        }
    #key = names(source)[1]
    for( key in names(source)){
        destItem <- dest[[key]]
        sourceItem <- source[[key]]
        dest[[key]] <- if( length(destItem)==0 || !(is.vector(sourceItem) || is.list(sourceItem)) ){ 
                sourceItem
            }else{
                tmp <- twMergeLists(destItem, sourceItem, level+1)
                #if( is.list(tmp) ) list(tmp) else if( is.vector(tmp) )  else tmp
            }
    }
    ##value<< modified argument dest
    dest
}
attr(twMergeLists,"ex") <- function(){
    dest0 <- list(a=1, b=list(b1=2, b2=4), c=2)
    source0 <- list(b=list(b1=12))
    (tmp <- twMergeLists(dest0,source0))
    #
    dest0 <- list(a=1, b=c(b1=2, b2=4), c=2)
    source0 <- list(b=c(b1=12))
    (tmp <- twMergeLists(dest0,source0))
    
    (tmp <- twMergeLists( list(), source0) )
    
    (tmp <- twMergeLists( dest0, NULL) )
    
}

Try the twMisc package in your browser

Any scripts or data that you put into this service are public.

twMisc documentation built on May 2, 2019, 6:11 p.m.