-
-
Save brshallo/e963b9dca5e4e1ab12ec6348b135362e to your computer and use it in GitHub Desktop.
| library(magrittr) | |
| library(stringr) | |
| library(readr) | |
| library(purrr) | |
| library(glue) | |
| library(knitr) | |
| source_rmd_chunks <- function(file, chunk_labels, skip_plots = TRUE, output_temp = FALSE){ | |
| temp <- tempfile(fileext=".R") | |
| knitr::purl(file, output = temp) | |
| text <- readr::read_file(temp) | |
| text <- purrr::map(chunk_labels, ~stringr::str_extract(text, glue::glue("(## ----{var})(.|[:space:])*?(?=(## ----)|$)", var = .x))) %>% | |
| stringr::str_c(collapse = "\n") | |
| readr::write_file(text, temp) | |
| if(skip_plots) { | |
| old_dev = getOption('device') | |
| options(device = function(...) { | |
| .Call("R_GD_nullDevice", PACKAGE = "grDevices") | |
| }) | |
| } | |
| source(temp) | |
| if(skip_plots) { | |
| options(device = old_dev) | |
| } | |
| if(output_temp) temp | |
| } |
If sourcing from github file, remember to use the "raw " file.
Hello @brshallo
This is really helpful for what I want to do, thanks! One quick question/comment, have you considered making a PR to knitr for this? I think it would be really helpful to have this as part of the standard package.
Edit: oh also I noticed a potential improvement in the regex. As you currently have:
text <- purrr::map(chunk_labels, ~stringr::str_extract(text, glue::glue("(## ----{var})(.|[:space:])*?(?=(## ----)|$)", var = .x))) %>%
stringr::str_c(collapse = "\n")It can get confused with chunk labels that start the same. For example, if I have labels that are tuning and tuning-grid and I put in the chunk label as just "tuning" then, in my case, it will only find the tuning-grid chunk (presumably because this one comes first) and never return the tuning chunk (unless I hack it by putting something like "tuning----" as the chunk label to find). But this can be mitigated by changing the regex to:
text <- purrr::map(chunk_labels, ~stringr::str_extract(text, glue::glue("(## ----{var}----)(.|[:space:])*?(?=(## ----)|$)", var = .x))) %>%
stringr::str_c(collapse = "\n")(i.e. changing ----{var} to ----{var}----)
Edit 2 - balls, that idea doesn't work if there are any chunk options... so now it has to be something like:
text <- purrr::map(chunk_labels, ~stringr::str_extract(text, glue::glue("(## ----{var})(----|,|.|[:space:])*?(?=(## ----)|$)", var = .x))) %>%
stringr::str_c(collapse = "\n")But now we're back at tuning-grid not tuning being found! I'm not great with regex so I'll keep working on it.
Ok, I think this works, at least it does for me. From my limited regex understanding this should exclude any chunks where var is followed by a single hyphen or single underscore and then any letter or digit. So searching for a chunk called tuning won't accidentally pick up tuning-grid or tuning-2 or tuning_grid, you'd have to actually specify those full chunk names. But I'm not sure how robust it is - as long as no one ever names a chunk something like tuning--grid!
text <- purrr::map(chunk_labels, ~stringr::str_extract(text, glue::glue("(## ----{var})(?!(-|_)([a-z]|[A-Z]|[:digit:]))(----|,|.|[:space:])*?(?=(## ----)|$)", var = .x))) %>%
stringr::str_c(collapse = "\n")I don't think I need all the options in (----|,|.|[:space:]) but I'm trying to explicitly cover all the cases that might occur. For me it works without all of these anyway.
@py9mrg I wasn't really planning on it. My impression is Yihui isn't crazy about knitr::purl() so didn't know if he'd want to incorporate support for something like this...
Wouldn't hurt to open an issue though, feel free to @ me on jt.
See this thread: https://stackoverflow.com/questions/41962434/source-code-from-rmd-file-within-another-rmd (may need to make some changes to make more workable for use when knitting).
Also see link to gist by Noam Ross that I used as starting point: https://gist.github.com/noamross/a549ee50e8a4fd68b8b1