| Title: | Format R Code Automatically |
|---|---|
| Description: | Provides a function tidy_source() to format R source code. Spaces and indent will be added to the code automatically, and comments will be preserved under certain conditions, so that R code will be more human-readable and tidy. There is also a Shiny app as a user interface in this package (see tidy_app()). |
| Authors: | Yihui Xie [aut, cre] (ORCID: <https://orcid.org/0000-0003-0645-5666>), Ed Lee [ctb], Eugene Ha [ctb], Kohske Takahashi [ctb], Pavel Krivitsky [ctb] |
| Maintainer: | Yihui Xie <[email protected]> |
| License: | GPL |
| Version: | 1.14.1 |
| Built: | 2026-05-17 07:02:19 UTC |
| Source: | https://github.com/yihui/formatR |
Run a Shiny app that formats R code via tidy_source(). This app
uses input widgets, such as checkboxes, to pass arguments to
tidy_source().
tidy_app()tidy_app()
if (interactive()) formatR::tidy_app()if (interactive()) formatR::tidy_app()
Look for all R scripts under a directory (using the pattern
"[.][RrSsQq]$"), then tidy them with tidy_source(). If
successful, the original scripts will be overwritten with reformatted ones.
Please back up the original directory first if you do not fully understand
the tricks used by tidy_source(). tidy_file() formats
scripts specified by file names.
tidy_dir(path = ".", recursive = FALSE, ...) tidy_file(file, ...)tidy_dir(path = ".", recursive = FALSE, ...) tidy_file(file, ...)
path |
The path to a directory containning R scripts. |
recursive |
Whether to recursively look for R scripts under |
... |
Other arguments to be passed to |
file |
A vector of filenames. |
Invisible NULL.
Yihui Xie (tidy_dir) and Ed Lee (tidy_file)
library(formatR) path = tempdir() file.copy(system.file("demo", package = "base"), path, recursive = TRUE) tidy_dir(path, recursive = TRUE)library(formatR) path = tempdir() file.copy(system.file("demo", package = "base"), path, recursive = TRUE) tidy_dir(path, recursive = TRUE)
Evaluate R code by chunks, then insert the output to each chunk. As the output is masked in comments, the source code will not break.
tidy_eval( source = "clipboard", ..., file = "", prefix = "## ", envir = parent.frame() )tidy_eval( source = "clipboard", ..., file = "", prefix = "## ", envir = parent.frame() )
source |
The input file name (by default the clipboard; see
|
... |
Other arguments passed to |
file |
The file name to write to via |
prefix |
The prefix to mask the output. |
envir |
The environment in which to evaluate the code. By default the
parent frame; set |
Evaluated R code with corresponding output (printed on screen or written to a file).
library(formatR) ## evaluate simple code as a character vector tidy_eval(text = c("a<-1+1;a", "matrix(rnorm(10),5)")) ## evaluate a file tidy_eval(system.file("format", "messy.R", package = "formatR"))library(formatR) ## evaluate simple code as a character vector tidy_eval(text = c("a<-1+1;a", "matrix(rnorm(10),5)")) ## evaluate a file tidy_eval(system.file("format", "messy.R", package = "formatR"))
Parse the R code in the RStudio editor, identify %>%, and substitute
with |>.
tidy_pipe()tidy_pipe()
Currently this function only works inside the RStudio IDE, and may be extended in future to deal with arbitrary R code elsewhere.
formatR::tidy_pipe()formatR::tidy_pipe()
If any R code is selected in the RStudio source editor, this function reformats the selected code; otherwise it reformats the current open file (if it is unsaved, it will be automatically saved).
tidy_rstudio(...)tidy_rstudio(...)
... |
Arguments to be passed to |
If the output is not what you want, you can undo the change in the editor (Ctrl + Z or Command + Z).
formatR::tidy_rstudio() formatR::tidy_rstudio(args.newline = TRUE)formatR::tidy_rstudio() formatR::tidy_rstudio(args.newline = TRUE)
Read R code from a file or the clipboard and reformat it. This function is
based on parse() and deparse(), but it does
several other things, such as preserving blank lines and comments,
substituting the assignment operator = with <-, and
re-indenting code with a specified number of spaces.
tidy_source( source = "clipboard", comment = getOption("formatR.comment", TRUE), blank = getOption("formatR.blank", TRUE), arrow = getOption("formatR.arrow", FALSE), pipe = getOption("formatR.pipe", FALSE), brace.newline = getOption("formatR.brace.newline", FALSE), indent = getOption("formatR.indent", 4), wrap = getOption("formatR.wrap", TRUE), width.cutoff = getOption("formatR.width", getOption("width")), args.newline = getOption("formatR.args.newline", FALSE), output = TRUE, text = NULL, ... )tidy_source( source = "clipboard", comment = getOption("formatR.comment", TRUE), blank = getOption("formatR.blank", TRUE), arrow = getOption("formatR.arrow", FALSE), pipe = getOption("formatR.pipe", FALSE), brace.newline = getOption("formatR.brace.newline", FALSE), indent = getOption("formatR.indent", 4), wrap = getOption("formatR.wrap", TRUE), width.cutoff = getOption("formatR.width", getOption("width")), args.newline = getOption("formatR.args.newline", FALSE), output = TRUE, text = NULL, ... )
source |
A character string: file path to the source code (defaults to the clipboard). |
comment |
Whether to keep comments. |
blank |
Whether to keep blank lines. |
arrow |
Whether to substitute the assignment operator |
pipe |
Whether to substitute the magrittr pipe |
brace.newline |
Whether to put the left brace |
indent |
Number of spaces to indent the code. |
wrap |
Whether to wrap comments to the linewidth determined by
|
width.cutoff |
An integer in |
args.newline |
Whether to start the arguments of a function call on a
new line instead of after the function name and |
output |
Whether to output to the console or a file using
|
text |
An alternative way to specify the input: if |
... |
Other arguments passed to |
A value of the argument width.cutoff wrapped in I()
(e.g., I(60)) will be treated as the upper bound of the line
width. The corresponding argument to deparse() is a lower bound, so
the function will perform a binary search for a width value that can make
deparse() return code with line width smaller than or equal to the
width.cutoff value. If the search fails, a warning will signal,
suppressible by global option options(formatR.width.warning = FALSE).
A list with components
text.tidy |
the reformatted code as a character vector |
text.mask |
the code containing comments, which are masked in assignments or with the weird operator |
.
Be sure to read the reference to know other limitations.
Yihui Xie <https://yihui.org> with substantial contribution from Yixuan Qiu <https://yixuan.blog>
https://yihui.org/formatR/ (an introduction to this package, with examples and further notes)
library(formatR) ## a messy R script messy = system.file("format", "messy.R", package = "formatR") tidy_source(messy) ## use the 'text' argument src = readLines(messy) ## source code cat(src, sep = "\n") ## the formatted version tidy_source(text = src) ## preserve blank lines tidy_source(text = src, blank = TRUE) ## indent with 2 spaces tidy_source(text = src, indent = 2) ## discard comments! tidy_source(text = src, comment = FALSE) ## wanna see the gory truth?? tidy_source(text = src, output = FALSE)$text.mask ## tidy up the source code of image demo x = file.path(system.file(package = "graphics"), "demo", "image.R") # to console tidy_source(x) # to a file f = tempfile() tidy_source(x, blank = TRUE, file = f) ## check the original code here and see the difference file.show(x) file.show(f) ## use global options options(comment = TRUE, blank = FALSE) tidy_source(x) ## if you've copied R code into the clipboard if (interactive()) { tidy_source("clipboard") ## write into clipboard again tidy_source("clipboard", file = "clipboard") } ## the if-else structure tidy_source(text = c("{if(TRUE)1 else 2; if(FALSE){1+1", "## comments", "} else 2}"))library(formatR) ## a messy R script messy = system.file("format", "messy.R", package = "formatR") tidy_source(messy) ## use the 'text' argument src = readLines(messy) ## source code cat(src, sep = "\n") ## the formatted version tidy_source(text = src) ## preserve blank lines tidy_source(text = src, blank = TRUE) ## indent with 2 spaces tidy_source(text = src, indent = 2) ## discard comments! tidy_source(text = src, comment = FALSE) ## wanna see the gory truth?? tidy_source(text = src, output = FALSE)$text.mask ## tidy up the source code of image demo x = file.path(system.file(package = "graphics"), "demo", "image.R") # to console tidy_source(x) # to a file f = tempfile() tidy_source(x, blank = TRUE, file = f) ## check the original code here and see the difference file.show(x) file.show(f) ## use global options options(comment = TRUE, blank = FALSE) tidy_source(x) ## if you've copied R code into the clipboard if (interactive()) { tidy_source("clipboard") ## write into clipboard again tidy_source("clipboard", file = "clipboard") } ## the if-else structure tidy_source(text = c("{if(TRUE)1 else 2; if(FALSE){1+1", "## comments", "} else 2}"))
Print the reformatted usage of a function. The arguments of the function are
searched by argsAnywhere(), so the function can be either
exported or non-exported from a package. S3 methods will be marked.
usage( FUN, width = getOption("width"), tidy = TRUE, output = TRUE, indent.by.FUN = FALSE, fail = c("warn", "stop", "none") )usage( FUN, width = getOption("width"), tidy = TRUE, output = TRUE, indent.by.FUN = FALSE, fail = c("warn", "stop", "none") )
FUN |
The function name. |
width |
The width of the output. |
tidy |
Whether to reformat the usage code. |
output |
Whether to print the output to the console (via
|
indent.by.FUN |
Whether to indent subsequent lines by the width of the function name (see “Details”). |
fail |
A character string that represents the action taken when the width constraint is unfulfillable. "warn" and "stop" will signal warnings and errors, while "none" will do nothing. |
Line breaks in the output occur between arguments. In particular, default values of arguments will not be split across lines.
When indent.by.FUN is FALSE, indentation is set by the option
getOption("formatR.indent", 4L), the default value of the
indent argument of tidy_source().
Reformatted usage code of a function, in character strings (invisible).
library(formatR) usage(var) usage(plot) usage(plot.default) # default method usage("plot.lm") # on the 'lm' class usage(usage) usage(barplot.default, width = 60) # output lines have 60 characters or less # indent by width of 'barplot(' usage(barplot.default, width = 60, indent.by.FUN = TRUE) ## Not run: # a warning is raised because the width constraint is unfulfillable usage(barplot.default, width = 30) ## End(Not run)library(formatR) usage(var) usage(plot) usage(plot.default) # default method usage("plot.lm") # on the 'lm' class usage(usage) usage(barplot.default, width = 60) # output lines have 60 characters or less # indent by width of 'barplot(' usage(barplot.default, width = 60, indent.by.FUN = TRUE) ## Not run: # a warning is raised because the width constraint is unfulfillable usage(barplot.default, width = 30) ## End(Not run)