Package Workflows
Search Path
Planning Qualified Calls
The search path records attached packages, but package workflows are clearer when important calls are written with explicit namespaces.
Program
Play the script to choose a package and build the qualified call that avoids search-path ambiguity.
search_path_plan.R
Replay: real traced execution (multi-file project)
search_path <- c("package:stats", "package:graphics", "package:utils")
package_index <- 2
chosen <- c("stats", "graphics", "utils")[package_index]
functions <- c(stats = "median", graphics = "plot", utils = "head")
qualified <- paste0(chosen, "::", functions[[chosen]])
already_attached <- paste0("package:", chosen) %in% search_path
label <- paste(qualified, already_attached, sep = "=")
cat(label, "\n", sep = "")
search_path <- c("package:stats", "package:graphics", "package:utils")
package_index <- 1
chosen <- c("stats", "graphics", "utils")[package_index]
functions <- c(stats = "median", graphics = "plot", utils = "head")
qualified <- paste0(chosen, "::", functions[[chosen]])
already_attached <- paste0("package:", chosen) %in% search_path
label <- paste(qualified, already_attached, sep = "=")
cat(label, "\n", sep = "")
search_path <- c("package:stats", "package:graphics", "package:utils")
package_index <- 3
chosen <- c("stats", "graphics", "utils")[package_index]
functions <- c(stats = "median", graphics = "plot", utils = "head")
qualified <- paste0(chosen, "::", functions[[chosen]])
already_attached <- paste0("package:", chosen) %in% search_path
label <- paste(qualified, already_attached, sep = "=")
cat(label, "\n", sep = "")
search_path ← package:stats, package:graphics, package:utils
1search_path <- c("package:stats", "package:graphics", "package:utils")2package_index <- 2values this steppackage:stats, package:graphics, package:utilssearch_pathpackage_index ← 2
1search_path <- c("package:stats", "package:graphics", "package:utils")2package_index <- 23chosen <- c("stats", "graphics", "utils")[package_index]values this step2package_indexchosen ← graphics
2package_index <- 23chosen <- c("stats", "graphics", "utils")[package_index]4functions <- c(stats = "median", graphics = "plot", utils = "head")values this stepgraphicschosen2package_indexfunctions ← stats=median, graphics=plot, utils=head
3chosen <- c("stats", "graphics", "utils")[package_index]4functions <- c(stats = "median", graphics = "plot", utils = "head")5qualified <- paste0(chosen, "::", functions[[chosen]])values this stepstats=median, graphics=plot, utils=headfunctionsqualified ← graphics::plot
4functions <- c(stats = "median", graphics = "plot", utils = "head")5qualified <- paste0(chosen, "::", functions[[chosen]])6already_attached <- paste0("package:", chosen) %in% search_pathvalues this stepgraphics::plotqualifiedgraphicschosenplotfunctions[[chosen]]already_attached ← TRUE
5qualified <- paste0(chosen, "::", functions[[chosen]])6already_attached <- paste0("package:", chosen) %in% search_path7label <- paste(qualified, already_attached, sep = "=")values this stepTRUEalready_attachedgraphicschosen3 entriessearch_pathlabel ← graphics::plot=TRUE
6already_attached <- paste0("package:", chosen) %in% search_path7label <- paste(qualified, already_attached, sep = "=")8cat(label, "\n", sep = "")values this stepgraphics::plot=TRUElabelgraphics::plotqualifiedTRUEalready_attachedcat(label, " ", sep = "")
7label <- paste(qualified, already_attached, sep = "=")8cat(label, "\n", sep = "")outputgraphics::plot=TRUEvalues this stepgraphics::plot=TRUElabel
search_path ← package:stats, package:graphics, package:utils
1search_path <- c("package:stats", "package:graphics", "package:utils")2package_index <- 1values this steppackage:stats, package:graphics, package:utilssearch_pathpackage_index ← 1
1search_path <- c("package:stats", "package:graphics", "package:utils")2package_index <- 13chosen <- c("stats", "graphics", "utils")[package_index]values this step1package_indexchosen ← stats
2package_index <- 13chosen <- c("stats", "graphics", "utils")[package_index]4functions <- c(stats = "median", graphics = "plot", utils = "head")values this stepstatschosen1package_indexfunctions ← stats=median, graphics=plot, utils=head
3chosen <- c("stats", "graphics", "utils")[package_index]4functions <- c(stats = "median", graphics = "plot", utils = "head")5qualified <- paste0(chosen, "::", functions[[chosen]])values this stepstats=median, graphics=plot, utils=headfunctionsqualified ← stats::median
4functions <- c(stats = "median", graphics = "plot", utils = "head")5qualified <- paste0(chosen, "::", functions[[chosen]])6already_attached <- paste0("package:", chosen) %in% search_pathvalues this stepstats::medianqualifiedstatschosenmedianfunctions[[chosen]]already_attached ← TRUE
5qualified <- paste0(chosen, "::", functions[[chosen]])6already_attached <- paste0("package:", chosen) %in% search_path7label <- paste(qualified, already_attached, sep = "=")values this stepTRUEalready_attachedstatschosen3 entriessearch_pathlabel ← stats::median=TRUE
6already_attached <- paste0("package:", chosen) %in% search_path7label <- paste(qualified, already_attached, sep = "=")8cat(label, "\n", sep = "")values this stepstats::median=TRUElabelstats::medianqualifiedTRUEalready_attachedcat(label, " ", sep = "")
7label <- paste(qualified, already_attached, sep = "=")8cat(label, "\n", sep = "")outputstats::median=TRUEvalues this stepstats::median=TRUElabel
search_path ← package:stats, package:graphics, package:utils
1search_path <- c("package:stats", "package:graphics", "package:utils")2package_index <- 3values this steppackage:stats, package:graphics, package:utilssearch_pathpackage_index ← 3
1search_path <- c("package:stats", "package:graphics", "package:utils")2package_index <- 33chosen <- c("stats", "graphics", "utils")[package_index]values this step3package_indexchosen ← utils
2package_index <- 33chosen <- c("stats", "graphics", "utils")[package_index]4functions <- c(stats = "median", graphics = "plot", utils = "head")values this steputilschosen3package_indexfunctions ← stats=median, graphics=plot, utils=head
3chosen <- c("stats", "graphics", "utils")[package_index]4functions <- c(stats = "median", graphics = "plot", utils = "head")5qualified <- paste0(chosen, "::", functions[[chosen]])values this stepstats=median, graphics=plot, utils=headfunctionsqualified ← utils::head
4functions <- c(stats = "median", graphics = "plot", utils = "head")5qualified <- paste0(chosen, "::", functions[[chosen]])6already_attached <- paste0("package:", chosen) %in% search_pathvalues this steputils::headqualifiedutilschosenheadfunctions[[chosen]]already_attached ← TRUE
5qualified <- paste0(chosen, "::", functions[[chosen]])6already_attached <- paste0("package:", chosen) %in% search_path7label <- paste(qualified, already_attached, sep = "=")values this stepTRUEalready_attachedutilschosen3 entriessearch_pathlabel ← utils::head=TRUE
6already_attached <- paste0("package:", chosen) %in% search_path7label <- paste(qualified, already_attached, sep = "=")8cat(label, "\n", sep = "")values this steputils::head=TRUElabelutils::headqualifiedTRUEalready_attachedcat(label, " ", sep = "")
7label <- paste(qualified, already_attached, sep = "=")8cat(label, "\n", sep = "")outpututils::head=TRUEvalues this steputils::head=TRUElabel
search path
`search()` reports attached packages; this example models that list as data.
namespace
`qualified` stores a package-qualified function name.
membership
`%in%` checks whether the chosen package is attached.