Skip to contents

This function extracts the R source code from a package. For installed packages, it retrieves the package namespace and deparses all functions found in the package. For package source directories or archives (non-installed packages), it reads all .R files from the R directory and, optionally, from the tests directory. Optionally, it can include roxygen2 documentation from these files.

Usage

rdd_extract_code(
  pkg,
  file = NULL,
  include_tests = FALSE,
  include_roxygen = FALSE,
  force_fetch = FALSE,
  cache_path = getOption("rdocdump.cache_path"),
  repos = getOption("rdocdump.repos", getOption("repos"))
)

Arguments

pkg

A character string specifying the package. This can be:

  • an installed package name,

  • a full path to a package source directory,

  • a full path to a package archive file (tar.gz), or

  • a package name not installed (which will then be downloaded from CRAN).

file

Optional. Save path for the output text file. If set, the function will return the path to the file instead of the combined text. Defaults to NULL.

include_tests

logical. If TRUE, for non-installed packages, the function will also include R source code from the tests directory. Defaults to FALSE.

include_roxygen

logical. If TRUE, roxygen2 documentation lines (lines starting with "#'") from R files will be included in the output. Defaults to FALSE.

force_fetch

logical. If TRUE, the package source will be fetched from CRAN even if the package is installed locally. Default is FALSE.

cache_path

A character string specifying the directory to use as a cache. Defaults to the value of getOption("rdocdump.cache_path").

repos

A character vector of repository URLs. By default, it uses the value of getOption("rdocdump.repos") which sets the repository URLs to the default R repositories and is itself set to c("CRAN" = "https://cloud.r-project.org") on package load to prevent accidental downloads of pre-built packages from Posit Package Manager and R Universe.

Value

A single string containing the combined R source code (and, optionally, roxygen2 documentation) from the package.

Examples

# Extract only R source code (excluding roxygen2 documentation) from an installed package.
code <- rdd_extract_code("stats")
cat(substr(code, 1, 1000))
#> --------------------------------------------------------------------------------
#> Function: .Diag()
#> function (nms, sparse) 
#> {
#>     n <- as.integer(length(nms))
#>     d <- c(n, n)
#>     dn <- list(nms, nms)
#>     if (sparse) {
#>         if (!suppressPackageStartupMessages(requireNamespace("Matrix"))) 
#>             stop(gettextf("%s needs package 'Matrix' correctly installed", 
#>                 "contr*(.., sparse=TRUE)"), domain = NA)
#>         methods::new("ddiMatrix", diag = "U", Dim = d, Dimnames = dn)
#>     }
#>     else array(c(rep.int(c(1, numeric(n)), n - 1L), 1), d, dn)
#> }
#> 
#> --------------------------------------------------------------------------------
#> Function: .MFclass()
#> function (x) 
#> {
#>     if (is.logical(x)) 
#>         return("logical")
#>     if (is.ordered(x)) 
#>         return("ordered")
#>     if (is.factor(x)) 
#>         return("factor")
#>     if (is.character(x)) 
#>         return("character")
#>     if (is.matrix(x) && is.numeric(x)) 
#>         return(paste0("nmatrix.", ncol(x)))
#>     if (is.numeric(x)) 
#>      

# Extract R source code including roxygen2 documentation from a package source directory.
local({
 code_with_roxygen <- rdd_extract_code(
  "ini",
  include_roxygen = TRUE,
  force_fetch = TRUE,
  repos = c("CRAN" = "https://cran.r-project.org")
)
 cat(substr(code_with_roxygen, 1, 1000))
})
#> Fetching package source from CRAN...
#> 
#> --------------------------------------------------------------------------------
#> File: ini.R
#> 
#> #' Read and parse .ini file to list
#> #'
#> #' @param filepath file to parse
#> #' @param encoding Encoding of filepath parameter, will default to system
#> #' encoding if not specifield
#> #'
#> #' @details Lines starting with '#' or ';' are comments and will not be parsed
#> #'
#> #' @seealso \code{\link{write.ini}}
#> #'
#> #' @return List with length equivalent to number of [sections], each section is
#> #' a new list
#> #'
#> #' @examples
#> #' ## Create a new temp ini for reading
#> #' iniFile <- tempfile(fileext = '.ini')
#> #'
#> #' sink(iniFile)
#> #' cat("; This line is a comment\n")
#> #' cat("# This one too!\n")
#> #' cat("[    Hello World]\n")
#> #' cat("Foo = Bar          \n")
#> #' cat("Foo1 = Bar=345 \n")
#> #' sink()
#> #'
#> #' ## Read ini
#> #' checkini <- read.ini(iniFile)
#> #'
#> #' ## Check structure
#> #' checkini
#> #' checkini$`Hello World`$Foo
#> #'
#> #' @export
#> #'
#> read.ini <- function(filepath, encoding = getOption("encoding")) {
#> 
#>   index <- function(x, run

# Extract R source code from a package source directory,
# including test files but excluding roxygen2 docs.
local({
 code_with_tests <- rdd_extract_code(
  "ini",
  include_roxygen = TRUE,
  include_tests = TRUE,
  force_fetch = TRUE,
  repos = c("CRAN" = "https://cran.r-project.org")
)
 cat(substr(code_with_tests, 1, 1000))
})
#> Fetching package source from CRAN...
#> 
#> --------------------------------------------------------------------------------
#> File: ini.R
#> 
#> #' Read and parse .ini file to list
#> #'
#> #' @param filepath file to parse
#> #' @param encoding Encoding of filepath parameter, will default to system
#> #' encoding if not specifield
#> #'
#> #' @details Lines starting with '#' or ';' are comments and will not be parsed
#> #'
#> #' @seealso \code{\link{write.ini}}
#> #'
#> #' @return List with length equivalent to number of [sections], each section is
#> #' a new list
#> #'
#> #' @examples
#> #' ## Create a new temp ini for reading
#> #' iniFile <- tempfile(fileext = '.ini')
#> #'
#> #' sink(iniFile)
#> #' cat("; This line is a comment\n")
#> #' cat("# This one too!\n")
#> #' cat("[    Hello World]\n")
#> #' cat("Foo = Bar          \n")
#> #' cat("Foo1 = Bar=345 \n")
#> #' sink()
#> #'
#> #' ## Read ini
#> #' checkini <- read.ini(iniFile)
#> #'
#> #' ## Check structure
#> #' checkini
#> #' checkini$`Hello World`$Foo
#> #'
#> #' @export
#> #'
#> read.ini <- function(filepath, encoding = getOption("encoding")) {
#> 
#>   index <- function(x, run