Enhanced tidy.source() (Preserve Some Comments)
[This article was first published on Keep on Fighting! » R Language, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
After a few hours’ work, I modified the function tidy.source()
in the animation package so that it can preserve complete comment lines. See the tidy.source()
wiki page for example.
tidy.source <- function(source = "clipboard", keep.comment = TRUE, keep.blank.line = FALSE, begin.comment, end.comment, ...) { # parse and deparse the code tidy.block = function(block.text) { exprs = parse(text = block.text) n = length(exprs) res = character(n) for (i in 1:n) { dep = paste(deparse(exprs[i]), collapse = "\n") res[i] = substring(dep, 12, nchar(dep) - 1) } return(res) } text.lines = readLines(source, warn = FALSE) if (keep.comment) { # identifier for comments identifier = function() paste(sample(LETTERS), collapse = "") if (missing(begin.comment)) begin.comment = identifier() if (missing(end.comment)) end.comment = identifier() # remove leading and trailing white spaces text.lines = gsub("^[[:space:]]+|[[:space:]]+$", "", text.lines) # make sure the identifiers are not in the code # or the original code might be modified while (length(grep(sprintf("%s|%s", begin.comment, end.comment), text.lines))) { begin.comment = identifier() end.comment = identifier() } head.comment = substring(text.lines, 1, 1) == "#" # add identifiers to comment lines to cheat R parser if (any(head.comment)) { text.lines[head.comment] = gsub("\"", "\'", text.lines[head.comment]) text.lines[head.comment] = sprintf("%s=\"%s%s\"", begin.comment, text.lines[head.comment], end.comment) } # keep blank lines? blank.line = text.lines == "" if (any(blank.line) & keep.blank.line) text.lines[blank.line] = sprintf("%s=\"%s\"", begin.comment, end.comment) text.tidy = tidy.block(text.lines) # remove the identifiers text.tidy = gsub(sprintf("%s = \"|%s\"", begin.comment, end.comment), "", text.tidy) } else { text.tidy = tidy.block(text.lines) } cat(paste(text.tidy, collapse = "\n"), "\n", ...) invisible(text.tidy) }
Note that inline comments will still be removed. I don’t want to spend more time on dealing with inline comments any more.
Related Posts
To leave a comment for the author, please follow the link and comment on their blog: Keep on Fighting! » R Language.
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.