33
votes

Is it possible to include code from an external R script in an .Rmd and simultaneously run the code, display the code, and display its results in the output .HTML file? For example, if I have

x <- 1
y <- 3
z <- x + y
z

in external.R. In the output document I want to see the code above along with the result of z, i.e. 4. Essentially, I want the equivalent of what would happen if I copy/pasted what's above in an R chunk. So I want

```{r}
some.library::some.function("external.R")
```

to be the equivalent of

```{r}
x <- 1
y <- 3
z <- x + y
z
```

In the output HTML file. I've tried things like knitr::read_chunk('external.R) and source('external.R)`, but these don't display the code. Am I missing something simple?


EDIT

I found that source('external.R', echo = TRUE) will produce what I ask, but each line of the output's displayed code/results is prepended by ##. Any way to make it look like it would if the code was simply copy/pasted in a chunk in the .Rmd?

3
I guess my first question is: Why? What are you trying to do? Secondly, if I do source("my_script.R", echo = T) I don't see any code/results prefixed by ##. It looks exactly how it would look if I were to copy&paste code into an R terminal. Perhaps I misunderstood?Maurits Evers
We'll, I'm not comparing the result to what it would look like in in an R terminal. I'm comparing it to how it looks in an output .HTML file.haff
I'm giving my students an assignment where they have to complete several lengthy tasks, and for organizational purposes, I think it's easier to use external scripts rather than put everything in multiple code chunks. Also, if they execute code line-by-line in a code chunk in a .Rmd, Rstudio puts the output in a "drawer" under the chunk, which is annoying to me, as I think it makes more sense for it to appear in the console like it does in a simple .R file.haff
I'm not quite following. You seem to be mixing up RMarkdown and straight-up R files. If you don't like the way RMarkdown renders code&text, don't use RMarkdown. But then you are saying that you are "not comparing the result to what it would look like in in an R terminal." So what are you actually trying to do and how are you executing code? In a R terminal? In RStudio? Is code in an RMarkdown file? Or in an R script. I've had my students very successfully use RMarkdown and R Notebooks. In my opinion it encourages transparent code documentation and consistent coding standards.Maurits Evers
I love the way Rmarkdown renders code and text. What I'm saying is that if I use source('external.R', echo = T), the output HTML file has ## in front of each line. If I were to simply copy/paste the contents of my external R code into a code chunk in the .Rmd, it renders without the ##. Does that make sense? My comment about the result is the terminal was in reference to your first comment about what the result looks like in an R terminal. I don't really care about that - I only care about how it looks in the output HTML file.haff

3 Answers

36
votes

Although the accepted answer provides a simple and working solution, I think the most idiomatic way of doing this (without having to modify the external script at all) is to use the chunk option code to set the contents of external.R as chunk code:

```{r, code = readLines("external.R")}
```
14
votes

There is another way of doing it so it looks exactly like having the code in the markdown file.

Your external.R file:

## @knitr answer
x <- 1
y <- 3
z <- x + y
z

Your Rmarkdown file:

---
title: "Untitled"
output: html_document
---

```{r echo=FALSE}
knitr::read_chunk('external.R')
```

```{r}
<<answer>>
```

That produces: enter image description here

10
votes

You could set comment = NA in your code chunk options.

Example:

---
title: "Untitled"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(
    echo = TRUE,
    comment=NA)
```

## Example

```{r}
source("example.R", echo = T, prompt.echo = "", spaced = F)
```

This produces

enter image description here