You could replace your 'depth' argument with one that shows where in the original data you are at:
leaf.func <- function(data, where) { if(is.null(data)) stop("Null data at ", deparse(where)) return(mean(data)) } visit.level <- function(data, where = integer()) { if (length(where) == 2) { return(leaf.func(data, where)) } else { res <- lapply(seq_along(data), function(i) visit.level(data[[i]], where = c(where, i))) names(res) <- names(data) return(res) } } E.g., > new.data <- visit.level(data, integer()) Error in leaf.func(data, where) : Null data at c(3L, 2L) > data[[3]][2] $Madrid NULL Bill Dunlap TIBCO Software wdunlap tibco.com On Mon, Aug 14, 2017 at 11:43 AM, Giovanni Gherdovich < g.gherdov...@gmail.com> wrote: > Hello, > > I'm writing a program that takes a tree in input (nested lists) and > returns a copy of it replacing the leaves with something else (eg: a > computation done on the original leaves). > In the example below, the tree is composed by countries and cities, > and the leaves (children of the cities) are vectors of numbers. The > program takes this tree and replaces the vectors at the bottom by > their mean. > > I use a recursive function and lapply, and I give names to the > returned list after I get them from lapply. I was happy until I > realised that when I have some anomaly in the data (in the example at > Spain/Madrid I have NULL instead of a vector -- I simulate an error > artificially with stop()) I have no way to trace where in the original > tree is the problem, as the names are lost when I do lapply. I was > thinking to use tryCatch() and do something smart at error/warning, > but I'm afraid the information is all lost. > > Is there any obvious way I am missing that would give me the debug > information I need? In the example above ideally I'd like to know that > the program stopped at the path Spain/Madrid. > > > # ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ > data <- list("France" = list("Paris" = c(21, 34, 42), > "Marseille" = c(23, 51, 64), > "Toulouse" = c(78, 43, 25)), > "Germany" = list("Berlin" = c(43, 20, 87), > "Munich" = c(89, 45, 34), > "Hamburg" = c(98, 78, 32)), > "Spain" = list("Barcelona" = c(43, 49, 72), > "Madrid" = NULL, > "Valencia" = c(23, 23, 76))) > > leaf.func <- function(data) { > if(is.null(data)) stop() > return(mean(data)) > } > > visit.level <- function(data, depth) { > if (depth == 2) { > return(leaf.func(data)) > } else { > res <- lapply(data, visit.level, depth + 1) > names(res) <- names(data) > return(res) > } > } > > new.data <- visit.level(data, 0) > # ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ > > > Thanks, > Giovanni > > ______________________________________________ > R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/ > posting-guide.html > and provide commented, minimal, self-contained, reproducible code. > [[alternative HTML version deleted]] ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.