lookup
Lookup R function definitions, including compiled code, S3 and S4 methods from packages installed locally, or from GitHub, CRAN or Bioconductor.
Installation
# install.packages("devtools")
devtools::install_github("jimhester/lookup")
See Setup for additional setup instructions.
Example
Normal Functions (with compiled code)
S3 generics and methods
S4 generics and methods
In RStudio IDE
Usage
# Lookup a function
lookup::lookup(body)
#> base::body [closure]
#> function (fun = sys.function(sys.parent()))
#> {
#> if (is.character(fun))
#> fun <- get(fun, mode = "function", envir = parent.frame())
#> .Internal(body(fun))
#> }
#> <bytecode: 0x7fa65cada988>
#> <environment: namespace:base>
#> // c source: src/main/builtin.c#L255-L266
#> SEXP attribute_hidden do_body(SEXP call, SEXP op, SEXP args, SEXP rho)
#> {
#> checkArity(op, args);
#> if (TYPEOF(CAR(args)) == CLOSXP)
#> return duplicate(BODY_EXPR(CAR(args)));
#> else {
#> if(!(TYPEOF(CAR(args)) == BUILTINSXP ||
#> TYPEOF(CAR(args)) == SPECIALSXP))
#> warningcall(call, _("argument is not a function"));
#> return R_NilValue;
#> }
#> }
# Can also open a browser at that function's location
lookup_browse()
Setup
lookup makes heavy use of the GitHub API, which has a rate limit of 60 requests per hour when unauthenticated. You can create a Personal access token with no scope, which will increase your limit to 5000 requests per hour.
The usethis package has a helper function to help you generate such a token, usethis::browse_github_token()
.
Once you have generated a token, add it to your ~/.Renviron
file or shell
startup file and it will be automatically used for further requests.
GITHUB_PAT=7d8d0436835d1baXYZ1234
gh::gh("/rate_limit")
can be used to query your current usage and limits.
Default printing
lookup can be used as a complete replacement for function printing by attaching
the package. To make this the default simply add this to your .Rprofile
.
if (interactive()) {
suppressPackageStartupMessages(library(lookup))
}
If you do not want make this the default simply call lookup::lookup()
.
How this works
If a base R function is printed that calls compiled code the code is looked up
using the R git mirror. If a CRAN package
has compiled code it is looked up on the CRAN git
mirror. If a package is installed with
devtools::install_github()
or devtools::install()
the remote or local
repository location is searched for the code.
This has been tested to work with .Internal
, .External
, .C
, .Call
and
Rcpp calls.
Issues
This package uses a number of heuristics to find function definitions. This means it can fail in some cases, if you find a function that is not looked up properly, please open an issue.
Thanks
- R Core and Community For promoting open source software to make this possible.
- Winston Chang For running the Git mirror of the R Source.
- Gรกbor Csรกrdi For the gh package, the CRAN git mirror and inspiration and code for handling pagination and busy updating.
- Jenny Bryan For codifying the process of accessing the R source, which was my main inspiration and motivation for starting this package.
- Hadley Wickham For writing
pryr::show_c_source()
which provides a simplified version of looking up internal and primitive calls and additional prior functions to test for S3 method and generic membership.