Add flatten function for flattening a list
trinker opened this issue · 0 comments
trinker commented
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"