Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

RMarkdown in Shiny Application

Problem

Is there a way to insert (and evaluate) an RMarkdown script in a shiny application. (Note, I am not looking for a shiny application in RMarkdown that is explained here, nor am I looking for Markdown scripts in shiny (see Shiny Gallery Markdown))

I am building an application that has text, equations, code-chunks, plots, and interactive elements. For convenience I use Markdown files for the text and equations and would like to have a plot sometimes in between (i.e. write most stuff in RMarkdown). As the shiny-app is more complex (I use shinydashboard including many of its unique features), I would prefer an option that does not use the approach described in the first link.

A minimum working example would be:

R-file:

library(shiny)  ui <- shinyUI(   fluidPage(     includeMarkdown("RMarkdownFile.rmd")   ) ) server <- function(input, output) {}  shinyApp(ui, server) 

and "RMarkdownFile.rmd" in the same folder:

This is a text  $$ E(x) = 0 $$   ```{r, eval = T} plot(rnorm(100)) ``` 

Result:

Shiny App

Target

What I want to have is the output if I knit the rmd-file: RMarkdown HTML page

Specifically, I want to get the evaluation of the code-chunks (plot something...), and I want to get the rendered math equations.

Any ideas?

Edited Solution

Thanks to the input of @Bunk, I chose to render all rmd files to md files with the command knit and then include the md files in the shiny app (I use markdown instead of html as the latter produced some issues with equations). Lastly, the includeMarkdown is wrapped in withMathJax to ensure the proper display of equations.

The final code looks like this:

library(shiny) library(knitr)  rmdfiles <- c("RMarkdownFile.rmd") sapply(rmdfiles, knit, quiet = T)  ui <- shinyUI(     fluidPage(         withMathJax(includeMarkdown("RMarkdownFile.md"))   ) ) server <- function(input, output) { }  shinyApp(ui, server) 
like image 592
David Avatar asked Nov 03 '15 12:11

David


People also ask

How do I embed a shiny app in RMarkdown?

There are two ways to do this: Defining the application inline using the shinyApp() function; or. Referring to an external application directory using the shinyAppDir() function.

What are the two main differences between an R Markdown document and a shiny dashboard?

It generally comes down to the amount of interactivity you need in your app. For a full solution where data is updated and processed in real-time, Shiny is your best option. If you just need a nice format for presentation offline, then RMarkdown can produce some very nice looking formats.

Why is my RMarkdown not knitting?

If a chunk works in R but not when you knit, it is almost always because you've changed a variable in your global working environment not using code in a chunk. Try restarting your R session and running each chunk sequentially to make sure all your variable values are up to date.

How do I upload an image to RMarkdown?

To insert an image, you can also use an R code chunk. --- title: "R Markdown Tips and Tricks" output: html_document --- You can also insert an image using R code: ```{r} knitr::include_graphics("img/rmarkdown_hex. png") ``` The image looks smaller by default though.


2 Answers

I think knitting it and rendering a UI should work.

library(shiny) library(knitr)  ui <- shinyUI(     fluidPage(         uiOutput('markdown')   ) ) server <- function(input, output) {     output$markdown <- renderUI({         HTML(markdown::markdownToHTML(knit('RMarkdownFile.rmd', quiet = TRUE)))     }) }  shinyApp(ui, server) 
like image 100
Rorschach Avatar answered Oct 16 '22 00:10

Rorschach


As per @elevendollar's request, this is what I ended up using:

library(shiny) library(knitr)  rmdfiles <- c("RMarkdownFile.rmd") sapply(rmdfiles, knit, quiet = T)  ui <- shinyUI(     fluidPage(         withMathJax(includeMarkdown("RMarkdownFile.md"))   ) ) server <- function(input, output) { }  shinyApp(ui, server) 
like image 29
David Avatar answered Oct 16 '22 00:10

David