Shows the relationship between calls on the stack. This function combines the results of sys.calls() and sys.parents() yielding a display that shows how frames on the call stack are related.

cst()

Examples

# If all evaluation is eager, you get a single tree f <- function() g() g <- function() h() h <- function() cst() f()
#> █ #> 1. ├─base::tryCatch(...) #> 2. │ └─base:::tryCatchList(expr, classes, parentenv, handlers) #> 3. │ ├─base:::tryCatchOne(...) #> 4. │ │ └─base:::doTryCatch(return(expr), name, parentenv, handler) #> 5. │ └─base:::tryCatchList(expr, names[-nh], parentenv, handlers[-nh]) #> 6. │ └─base:::tryCatchOne(expr, names, parentenv, handlers[[1L]]) #> 7. │ └─base:::doTryCatch(return(expr), name, parentenv, handler) #> 8. ├─base::withCallingHandlers(...) #> 9. ├─base::saveRDS(...) #> 10. ├─base::do.call(...) #> 11. ├─(function (what, args, quote = FALSE, envir = parent.frame()) ... #> 12. └─(function (..., crayon_enabled, crayon_colors, pkgdown_internet) ... #> 13. └─pkgdown::build_site(...) #> 14. └─pkgdown:::build_site_local(...) #> 15. └─pkgdown::build_reference(...) #> 16. └─purrr::map(...) #> 17. └─pkgdown:::.f(.x[[i]], ...) #> 18. └─pkgdown:::data_reference_topic(...) #> 19. ├─pkgdown:::as_data(...) #> 20. └─pkgdown:::as_data.tag_examples(...) #> 21. └─purrr::pmap_chr(...) #> 22. └─pkgdown:::.f(...) #> 23. ├─withr::with_options(...) #> 24. │ └─base::force(code) #> 25. └─evaluate::evaluate(code, env, new_device = TRUE) #> 26. └─evaluate:::evaluate_call(...) #> 27. ├─evaluate:::timing_fn(...) #> 28. ├─evaluate:::handle(...) #> 29. │ └─base::try(f, silent = TRUE) #> 30. │ └─base::tryCatch(...) #> 31. │ └─base:::tryCatchList(expr, classes, parentenv, handlers) #> 32. │ └─base:::tryCatchOne(expr, names, parentenv, handlers[[1L]]) #> 33. │ └─base:::doTryCatch(return(expr), name, parentenv, handler) #> 34. ├─base::withCallingHandlers(...) #> 35. ├─base::withVisible(eval(expr, envir, enclos)) #> 36. └─base::eval(expr, envir, enclos) #> 37. └─base::eval(expr, envir, enclos) #> 38. └─global::f() #> 39. └─global::g() #> 40. └─global::h() #> 41. └─lobstr::cst()
# You get multiple trees with delayed evaluation try(f())
#> █ #> 1. ├─base::tryCatch(...) #> 2. │ └─base:::tryCatchList(expr, classes, parentenv, handlers) #> 3. │ ├─base:::tryCatchOne(...) #> 4. │ │ └─base:::doTryCatch(return(expr), name, parentenv, handler) #> 5. │ └─base:::tryCatchList(expr, names[-nh], parentenv, handlers[-nh]) #> 6. │ └─base:::tryCatchOne(expr, names, parentenv, handlers[[1L]]) #> 7. │ └─base:::doTryCatch(return(expr), name, parentenv, handler) #> 8. ├─base::withCallingHandlers(...) #> 9. ├─base::saveRDS(...) #> 10. ├─base::do.call(...) #> 11. ├─(function (what, args, quote = FALSE, envir = parent.frame()) ... #> 12. └─(function (..., crayon_enabled, crayon_colors, pkgdown_internet) ... #> 13. └─pkgdown::build_site(...) #> 14. └─pkgdown:::build_site_local(...) #> 15. └─pkgdown::build_reference(...) #> 16. └─purrr::map(...) #> 17. └─pkgdown:::.f(.x[[i]], ...) #> 18. └─pkgdown:::data_reference_topic(...) #> 19. ├─pkgdown:::as_data(...) #> 20. └─pkgdown:::as_data.tag_examples(...) #> 21. └─purrr::pmap_chr(...) #> 22. └─pkgdown:::.f(...) #> 23. ├─withr::with_options(...) #> 24. │ └─base::force(code) #> 25. └─evaluate::evaluate(code, env, new_device = TRUE) #> 26. └─evaluate:::evaluate_call(...) #> 27. ├─evaluate:::timing_fn(...) #> 28. ├─evaluate:::handle(...) #> 29. │ └─base::try(f, silent = TRUE) #> 30. │ └─base::tryCatch(...) #> 31. │ └─base:::tryCatchList(expr, classes, parentenv, handlers) #> 32. │ └─base:::tryCatchOne(expr, names, parentenv, handlers[[1L]]) #> 33. │ └─base:::doTryCatch(return(expr), name, parentenv, handler) #> 34. ├─base::withCallingHandlers(...) #> 35. ├─base::withVisible(eval(expr, envir, enclos)) #> 36. └─base::eval(expr, envir, enclos) #> 37. └─base::eval(expr, envir, enclos) #> 38. ├─base::try(f()) #> 39. │ └─base::tryCatch(...) #> 40. │ └─base:::tryCatchList(expr, classes, parentenv, handlers) #> 41. │ └─base:::tryCatchOne(expr, names, parentenv, handlers[[1L]]) #> 42. │ └─base:::doTryCatch(return(expr), name, parentenv, handler) #> 43. └─global::f() #> 44. └─global::g() #> 45. └─global::h() #> 46. └─lobstr::cst()
# Pay attention to the first element of each subtree: each # evaluates the outermost call f <- function(x) g(x) g <- function(x) h(x) h <- function(x) x try(f(cst()))
#> █ #> 1. ├─base::tryCatch(...) #> 2. │ └─base:::tryCatchList(expr, classes, parentenv, handlers) #> 3. │ ├─base:::tryCatchOne(...) #> 4. │ │ └─base:::doTryCatch(return(expr), name, parentenv, handler) #> 5. │ └─base:::tryCatchList(expr, names[-nh], parentenv, handlers[-nh]) #> 6. │ └─base:::tryCatchOne(expr, names, parentenv, handlers[[1L]]) #> 7. │ └─base:::doTryCatch(return(expr), name, parentenv, handler) #> 8. ├─base::withCallingHandlers(...) #> 9. ├─base::saveRDS(...) #> 10. ├─base::do.call(...) #> 11. ├─(function (what, args, quote = FALSE, envir = parent.frame()) ... #> 12. └─(function (..., crayon_enabled, crayon_colors, pkgdown_internet) ... #> 13. └─pkgdown::build_site(...) #> 14. └─pkgdown:::build_site_local(...) #> 15. └─pkgdown::build_reference(...) #> 16. └─purrr::map(...) #> 17. └─pkgdown:::.f(.x[[i]], ...) #> 18. └─pkgdown:::data_reference_topic(...) #> 19. ├─pkgdown:::as_data(...) #> 20. └─pkgdown:::as_data.tag_examples(...) #> 21. └─purrr::pmap_chr(...) #> 22. └─pkgdown:::.f(...) #> 23. ├─withr::with_options(...) #> 24. │ └─base::force(code) #> 25. └─evaluate::evaluate(code, env, new_device = TRUE) #> 26. └─evaluate:::evaluate_call(...) #> 27. ├─evaluate:::timing_fn(...) #> 28. ├─evaluate:::handle(...) #> 29. │ └─base::try(f, silent = TRUE) #> 30. │ └─base::tryCatch(...) #> 31. │ └─base:::tryCatchList(expr, classes, parentenv, handlers) #> 32. │ └─base:::tryCatchOne(expr, names, parentenv, handlers[[1L]]) #> 33. │ └─base:::doTryCatch(return(expr), name, parentenv, handler) #> 34. ├─base::withCallingHandlers(...) #> 35. ├─base::withVisible(eval(expr, envir, enclos)) #> 36. └─base::eval(expr, envir, enclos) #> 37. └─base::eval(expr, envir, enclos) #> 38. ├─base::try(f(cst())) #> 39. │ └─base::tryCatch(...) #> 40. │ └─base:::tryCatchList(expr, classes, parentenv, handlers) #> 41. │ └─base:::tryCatchOne(expr, names, parentenv, handlers[[1L]]) #> 42. │ └─base:::doTryCatch(return(expr), name, parentenv, handler) #> 43. ├─global::f(cst()) #> 44. │ └─global::g(x) #> 45. │ └─global::h(x) #> 46. └─lobstr::cst()
# With a little ingenuity you can use it to see how NSE # functions work in base R with(mtcars, {cst(); invisible()})
#> █ #> 1. ├─base::tryCatch(...) #> 2. │ └─base:::tryCatchList(expr, classes, parentenv, handlers) #> 3. │ ├─base:::tryCatchOne(...) #> 4. │ │ └─base:::doTryCatch(return(expr), name, parentenv, handler) #> 5. │ └─base:::tryCatchList(expr, names[-nh], parentenv, handlers[-nh]) #> 6. │ └─base:::tryCatchOne(expr, names, parentenv, handlers[[1L]]) #> 7. │ └─base:::doTryCatch(return(expr), name, parentenv, handler) #> 8. ├─base::withCallingHandlers(...) #> 9. ├─base::saveRDS(...) #> 10. ├─base::do.call(...) #> 11. ├─(function (what, args, quote = FALSE, envir = parent.frame()) ... #> 12. └─(function (..., crayon_enabled, crayon_colors, pkgdown_internet) ... #> 13. └─pkgdown::build_site(...) #> 14. └─pkgdown:::build_site_local(...) #> 15. └─pkgdown::build_reference(...) #> 16. └─purrr::map(...) #> 17. └─pkgdown:::.f(.x[[i]], ...) #> 18. └─pkgdown:::data_reference_topic(...) #> 19. ├─pkgdown:::as_data(...) #> 20. └─pkgdown:::as_data.tag_examples(...) #> 21. └─purrr::pmap_chr(...) #> 22. └─pkgdown:::.f(...) #> 23. ├─withr::with_options(...) #> 24. │ └─base::force(code) #> 25. └─evaluate::evaluate(code, env, new_device = TRUE) #> 26. └─evaluate:::evaluate_call(...) #> 27. ├─evaluate:::timing_fn(...) #> 28. ├─evaluate:::handle(...) #> 29. │ └─base::try(f, silent = TRUE) #> 30. │ └─base::tryCatch(...) #> 31. │ └─base:::tryCatchList(expr, classes, parentenv, handlers) #> 32. │ └─base:::tryCatchOne(expr, names, parentenv, handlers[[1L]]) #> 33. │ └─base:::doTryCatch(return(expr), name, parentenv, handler) #> 34. ├─base::withCallingHandlers(...) #> 35. ├─base::withVisible(eval(expr, envir, enclos)) #> 36. └─base::eval(expr, envir, enclos) #> 37. └─base::eval(expr, envir, enclos) #> 38. ├─base::with(...) #> 39. └─base::with.default(...) #> 40. └─base::eval(substitute(expr), data, enclos = parent.frame()) #> 41. └─base::eval(substitute(expr), data, enclos = parent.frame()) #> 42. └─lobstr::cst()
invisible(subset(mtcars, {cst(); cyl == 0}))
#> █ #> 1. ├─base::tryCatch(...) #> 2. │ └─base:::tryCatchList(expr, classes, parentenv, handlers) #> 3. │ ├─base:::tryCatchOne(...) #> 4. │ │ └─base:::doTryCatch(return(expr), name, parentenv, handler) #> 5. │ └─base:::tryCatchList(expr, names[-nh], parentenv, handlers[-nh]) #> 6. │ └─base:::tryCatchOne(expr, names, parentenv, handlers[[1L]]) #> 7. │ └─base:::doTryCatch(return(expr), name, parentenv, handler) #> 8. ├─base::withCallingHandlers(...) #> 9. ├─base::saveRDS(...) #> 10. ├─base::do.call(...) #> 11. ├─(function (what, args, quote = FALSE, envir = parent.frame()) ... #> 12. └─(function (..., crayon_enabled, crayon_colors, pkgdown_internet) ... #> 13. └─pkgdown::build_site(...) #> 14. └─pkgdown:::build_site_local(...) #> 15. └─pkgdown::build_reference(...) #> 16. └─purrr::map(...) #> 17. └─pkgdown:::.f(.x[[i]], ...) #> 18. └─pkgdown:::data_reference_topic(...) #> 19. ├─pkgdown:::as_data(...) #> 20. └─pkgdown:::as_data.tag_examples(...) #> 21. └─purrr::pmap_chr(...) #> 22. └─pkgdown:::.f(...) #> 23. ├─withr::with_options(...) #> 24. │ └─base::force(code) #> 25. └─evaluate::evaluate(code, env, new_device = TRUE) #> 26. └─evaluate:::evaluate_call(...) #> 27. ├─evaluate:::timing_fn(...) #> 28. ├─evaluate:::handle(...) #> 29. │ └─base::try(f, silent = TRUE) #> 30. │ └─base::tryCatch(...) #> 31. │ └─base:::tryCatchList(expr, classes, parentenv, handlers) #> 32. │ └─base:::tryCatchOne(expr, names, parentenv, handlers[[1L]]) #> 33. │ └─base:::doTryCatch(return(expr), name, parentenv, handler) #> 34. ├─base::withCallingHandlers(...) #> 35. ├─base::withVisible(eval(expr, envir, enclos)) #> 36. └─base::eval(expr, envir, enclos) #> 37. └─base::eval(expr, envir, enclos) #> 38. ├─base::subset(...) #> 39. └─base::subset.data.frame(...) #> 40. └─base::eval(e, x, parent.frame()) #> 41. └─base::eval(e, x, parent.frame()) #> 42. └─lobstr::cst()
# You can also get unusual trees by evaluating in frames # higher up the call stack f <- function() g() g <- function() h() h <- function() eval(quote(cst()), parent.frame(2)) f()
#> █ #> 1. ├─base::tryCatch(...) #> 2. │ └─base:::tryCatchList(expr, classes, parentenv, handlers) #> 3. │ ├─base:::tryCatchOne(...) #> 4. │ │ └─base:::doTryCatch(return(expr), name, parentenv, handler) #> 5. │ └─base:::tryCatchList(expr, names[-nh], parentenv, handlers[-nh]) #> 6. │ └─base:::tryCatchOne(expr, names, parentenv, handlers[[1L]]) #> 7. │ └─base:::doTryCatch(return(expr), name, parentenv, handler) #> 8. ├─base::withCallingHandlers(...) #> 9. ├─base::saveRDS(...) #> 10. ├─base::do.call(...) #> 11. ├─(function (what, args, quote = FALSE, envir = parent.frame()) ... #> 12. └─(function (..., crayon_enabled, crayon_colors, pkgdown_internet) ... #> 13. └─pkgdown::build_site(...) #> 14. └─pkgdown:::build_site_local(...) #> 15. └─pkgdown::build_reference(...) #> 16. └─purrr::map(...) #> 17. └─pkgdown:::.f(.x[[i]], ...) #> 18. └─pkgdown:::data_reference_topic(...) #> 19. ├─pkgdown:::as_data(...) #> 20. └─pkgdown:::as_data.tag_examples(...) #> 21. └─purrr::pmap_chr(...) #> 22. └─pkgdown:::.f(...) #> 23. ├─withr::with_options(...) #> 24. │ └─base::force(code) #> 25. └─evaluate::evaluate(code, env, new_device = TRUE) #> 26. └─evaluate:::evaluate_call(...) #> 27. ├─evaluate:::timing_fn(...) #> 28. ├─evaluate:::handle(...) #> 29. │ └─base::try(f, silent = TRUE) #> 30. │ └─base::tryCatch(...) #> 31. │ └─base:::tryCatchList(expr, classes, parentenv, handlers) #> 32. │ └─base:::tryCatchOne(expr, names, parentenv, handlers[[1L]]) #> 33. │ └─base:::doTryCatch(return(expr), name, parentenv, handler) #> 34. ├─base::withCallingHandlers(...) #> 35. ├─base::withVisible(eval(expr, envir, enclos)) #> 36. └─base::eval(expr, envir, enclos) #> 37. └─base::eval(expr, envir, enclos) #> 38. └─global::f() #> 39. ├─global::g() #> 40. │ └─global::h() #> 41. │ └─base::eval(quote(cst()), parent.frame(2)) #> 42. │ └─base::eval(quote(cst()), parent.frame(2)) #> 43. └─lobstr::cst()