The pkgs %installed in% lib.loc operator
checks if one or more given packages (pkgs) exist
in the given library paths (lib.loc),
without loading the packages.
The syntax of this operator forces the user to make it
syntactically explicit
where to look for installed R-packages.
As pkgs %installed in% lib.loc does not even load a package,
the user can safely use it
without fearing any unwanted side-effects.
The pkg_get_deps() function gets the direct dependencies of a package
from the Description file. It works on non-CRAN packages also.
The pkg_get_deps_minimal() function is the same as
pkg_get_deps(),
except with
base, recom, rstudioapi, shared_tidy
all set to FALSE,
and the default value for deps_type is c("Depends", "Imports").
The pkg_lsf() function
gets a list of exported functions/operators from a package.
One handy use for this function is to, for example,
globally attach all infix operators from a package using library,
like so:
Usage
pkgs %installed in% lib.loc
pkg_get_deps(
package,
lib.loc = .libPaths(),
deps_type = c("LinkingTo", "Depends", "Imports"),
base = FALSE,
recom = TRUE,
rstudioapi = TRUE,
shared_tidy = TRUE
)
pkg_get_deps_minimal(
package,
lib.loc = .libPaths(),
deps_type = c("Depends", "Imports")
)
pkg_lsf(package, type, lib.loc = .libPaths())Arguments
- pkgs
a character vector with the package name(s).
- lib.loc
character vector specifying library search path (the location of R library trees to search through).
Thelib.locargument would usually be.libPaths().
See also loadNamespace.- package
a single string giving the package name.
- deps_type
a character vector, giving the dependency types to be used.
The order of the character vector given indeps_typeaffects the order of the returned character vector; see Details sections.- base
logical, indicating whether base/core R should be included (
TRUE), or not included (FALSE).- recom
logical, indicating whether the pre-installed 'recommended' R-packages should be included (
TRUE), or not included (FALSE).- rstudioapi
logical, indicating whether the 'rstudioapi' R-package should be included (
TRUE), or not included (FALSE).logical, indicating whether the shared dependencies of the 'tidyverse' should be included (
TRUE), or not included (FALSE).
Details:
Some of the (often many) dependencies 'tidyverse' packages have are shared across the majority of the 'tidyverse'.
The "official" list of shared dependencies in the 'tidyverse' currently is the following:
'rlang', 'lifecycle', 'cli', 'glue', and 'withr'.- type
The type of functions to list. Possibilities:
"inops"or"operators": Only infix operators."regfuns": Only regular functions (thus excluding infix operators)."all": All functions, both regular functions and infix operators.
Value
For pkgs %installed in% lib.loc:
Returns a named logical vector.
The names give the package names.
The value TRUE indicates a package is installed in lib.loc.
The value FALSE indicates a package is not installed in lib.loc.
The value NA indicates a package is not actually a separate package,
but base/core 'R'
(i.e. 'base', 'stats', etc.).
For pkg_get_deps() and pkg_get_deps_minimal():
A character vector of direct dependencies, without duplicates.
For pkg_lsf():
Returns a character vector of exported function names in the specified package.
Details
For pkg_get_deps():
For each string in argument deps_type,
the package names in the corresponding field of the Description file are extracted,
in the order as they appear in that field.
The order given in argument deps_type
also affects the order of the returned character vector:
For example, c("LinkingTo", "Depends", "Imports"),
means the package names are extracted from the fields in the following order:
"LinkingTo";
"Depends";
"Imports".
The unique (thus non-repeating)
package names are then returned to the user.
References
O'Brien J., elegantly extract R-package dependencies of a package not listed on CRAN. Stack Overflow. (1 September 2023). https://stackoverflow.com/questions/30223957/elegantly-extract-r-package-dependencies-of-a-package-not-listed-on-cran
Examples
"dplyr" %installed in% .libPaths()
#> dplyr
#> TRUE
pkg_get_deps_minimal("dplyr")
#> [1] "generics" "magrittr" "pillar" "R6" "tibble"
#> [6] "tidyselect" "vctrs"
pkgs <- pkg_get_deps("dplyr")
pkgs %installed in% .libPaths()
#> cli generics glue lifecycle magrittr pillar R6
#> TRUE TRUE TRUE TRUE TRUE TRUE TRUE
#> rlang tibble tidyselect vctrs
#> TRUE TRUE TRUE TRUE
pkg_lsf("dplyr", "all")
#> [1] "slice_max" "src" "db_desc"
#> [4] "group_by_drop_default" "db_commit" "coalesce"
#> [7] "summarize_if" "mutate_" "db_create_index"
#> [10] "join_by" "check_dbplyr" "src_tbls"
#> [13] "db_query_rows" "dense_rank" "slice_head"
#> [16] "tbl" "consecutive_id" "first"
#> [19] "arrange" "dplyr_row_slice" "sql_semi_join"
#> [22] "is.grouped_df" "summarise_each" "group_vars"
#> [25] "bind_cols" "last_dplyr_warnings" "distinct_at"
#> [28] "mutate_all" "relocate" "compute"
#> [31] "mutate_if" "distinct_" "group_indices_"
#> [34] "eval_tbls2" "rename_all" "count"
#> [37] "do_" "do" "cumany"
#> [40] "wrap_dbplyr_obj" "recode_factor" "same_src"
#> [43] "top_frac" "select_vars" "desc"
#> [46] "db_create_indexes" "lead" "mutate_at"
#> [49] "distinct_prepare" "src_sqlite" "distinct_if"
#> [52] "cur_column" "semi_join" "filter_if"
#> [55] "sql_translate_env" "arrange_" "case_match"
#> [58] "sql_set_op" "eval_tbls" "arrange_at"
#> [61] "add_count" "dplyr_reconstruct" "slice_min"
#> [64] "new_rowwise_df" "cross_join" "select"
#> [67] "distinct_all" "src_local" "as.tbl"
#> [70] "summarise" "db_drop_table" "rows_patch"
#> [73] "cur_data" "row_number" "groups"
#> [76] "anti_join" "tbl_vars" "cur_group_id"
#> [79] "auto_copy" "sql_subquery" "group_indices"
#> [82] "progress_estimated" "transmute_all" "new_grouped_df"
#> [85] "add_tally_" "group_data" "rows_insert"
#> [88] "all_equal" "group_split" "tbl_ptype"
#> [91] "inner_join" "db_insert_into" "db_save_query"
#> [94] "id" "summarise_all" "db_begin"
#> [97] "left_join" "summarize_each_" "dplyr_col_modify"
#> [100] "compare_tbls2" "filter" "union_all"
#> [103] "summarize_all" "slice_tail" "n"
#> [106] "add_count_" "summarize_each" "show_query"
#> [109] "group_cols" "summarise_at" "n_distinct"
#> [112] "transmute_at" "rename" "reframe"
#> [115] "select_vars_" "near" "pick"
#> [118] "n_groups" "across" "all_vars"
#> [121] "select_all" "slice" "na_if"
#> [124] "select_if" "grouped_df" "tbl_df"
#> [127] "tally_" "is.src" "db_create_table"
#> [130] "mutate_each" "group_keys" "add_rownames"
#> [133] "rename_vars" "select_at" "is.tbl"
#> [136] "arrange_all" "summarize" "cummean"
#> [139] "rename_with" "group_map" "current_vars"
#> [142] "with_groups" "last" "rowwise"
#> [145] "group_size" "nth" "src_postgres"
#> [148] "dim_desc" "transmute" "transmute_if"
#> [151] "case_when" "arrange_if" "order_by"
#> [154] "with_order" "group_rows" "any_vars"
#> [157] "db_analyze" "db_data_type" "top_n"
#> [160] "add_tally" "db_query_fields" "group_trim"
#> [163] "between" "select_" "lag"
#> [166] "mutate_each_" "percent_rank" "distinct"
#> [169] "group_by_prepare" "db_explain" "summarise_each_"
#> [172] "tbl_nongroup_vars" "bench_tbls" "is_grouped_df"
#> [175] "right_join" "summarise_if" "filter_"
#> [178] "cur_group_rows" "src_mysql" "summarize_at"
#> [181] "rows_delete" "combine" "ntile"
#> [184] "location" "symdiff" "sql_escape_string"
#> [187] "rename_vars_" "nest_by" "db_rollback"
#> [190] "filter_at" "collapse" "db_write_table"
#> [193] "db_has_table" "ungroup" "group_by"
#> [196] "funs" "vars" "if_all"
#> [199] "slice_sample" "recode" "validate_rowwise_df"
#> [202] "rename_" "cur_group" "group_nest"
#> [205] "filter_all" "src_df" "summarise_"
#> [208] "group_by_" "copy_to" "cur_data_all"
#> [211] "if_else" "transmute_" "funs_"
#> [214] "summarize_" "failwith" "compare_tbls"
#> [217] "sample_frac" "group_by_all" "explain"
#> [220] "rename_if" "sample_n" "group_by_if"
#> [223] "validate_grouped_df" "common_by" "group_walk"
#> [226] "changes" "make_tbl" "rows_upsert"
#> [229] "cume_dist" "ident" "rows_append"
#> [232] "rows_update" "select_var" "db_list_tables"
#> [235] "rename_at" "sql_escape_ident" "group_by_at"
#> [238] "pull" "mutate" "nest_join"
#> [241] "slice_" "count_" "group_modify"
#> [244] "if_any" "tally" "bind_rows"
#> [247] "c_across" "cumall" "collect"
#> [250] "min_rank" "sql" "sql_select"
#> [253] "sql_join" "full_join"