trinker/textshape

Add flatten function for flattening a list

trinker opened this issue · 0 comments

x <- list(
    urban = list(
        cars = c('volvo', 'ford'),
        food.dining = list(
            local.business = c('carls'),
            chain.business = c('dennys', 'panera')
        )
    ),
    rural = list(
        land.use = list(
            farming =list(
                dairy = c('cows'),
                vegie.plan = c('carrots')
            )
        ),
        social.rec = list(
            community.center = c('town.square')
        ),
        people.type = c('good', 'bad', 'in.between')
    ),
    other.locales = c('suburban'),
    missing = list(
        unknown = c(),
        known = c()
    ),
    end = c('wow')
)

flatten <- function(x , sep = '_', ...){

    x <- fix_names(x)
    
    out<- flatten_h(x)

    names(out) <- gsub('\\.', sep, names(out))
    
    names(out) <- gsub('unlikelystringtodupe', '.', names(out), fixed = TRUE)

    out

}

flatten_h <- function(x){

    z <- unlist(lapply(x, function(y) class(y)[1] == "list"))

    out <- c(x[!z], unlist(x[z], recursive=FALSE))

    if (sum(z)){
        Recall(out)
    } else {
        out
    }
}

fix_names.list <- function(v) {
  names(v) <- gsub('\\.', 'unlikelystringtodupe', names(v))
  lapply(v, fix_names)
}

fix_names.default <- function(v) v

fix_names <- function(v) UseMethod('fix_names')                       

x
                       
flatten(x)

Giving

$urban
$urban$cars
[1] "volvo" "ford" 

$urban$food.dining
$urban$food.dining$local.business
[1] "carls"

$urban$food.dining$chain.business
[1] "dennys" "panera"



$rural
$rural$land.use
$rural$land.use$farming
$rural$land.use$farming$dairy
[1] "cows"

$rural$land.use$farming$vegie.plan
[1] "carrots"



$rural$social.rec
$rural$social.rec$community.center
[1] "town.square"


$rural$people.type
[1] "good"       "bad"        "in.between"


$other.locales
[1] "suburban"

$missing
$missing$unknown
NULL

$missing$known
NULL


$end
[1] "wow"


$other.locales
[1] "suburban"

$end
[1] "wow"

$urban_cars
[1] "volvo" "ford" 

$rural_people.type
[1] "good"       "bad"        "in.between"

$missing_unknown
NULL

$missing_known
NULL

$urban_food.dining_local.business
[1] "carls"

$urban_food.dining_chain.business
[1] "dennys" "panera"

$rural_social.rec_community.center
[1] "town.square"

$rural_land.use_farming_dairy
[1] "cows"

$rural_land.use_farming_vegie.plan
[1] "carrots"