Following the steps of Brendan on this post https://brendanrocks.com/blogging-with-rmarkdown-knitr-jekyll/ I was able to successfully build my blog using knitr-jekyll and R markdown. However when it comes to embedding images on the .Rmd I am having a lot of trouble. The post output does not show any images embedded (just the plots produced by coding).
I tried using knitr::include_graphics() and also pure HTML tags (both ways directly in the .Rmd file) but got only empty spaces.
Thinking about the possibility of the problem being with paths I tried to move images to the figure/source folder but got nothing. Then I tried moving to a new folder called _data and adjusting the path on include_graphics() but got nothing again.
OS: Ubuntu 16.04
Current code with include_graphics():
```{r, out.width="900px", echo=FALSE}
knitr::include_graphics("path_root_site/_data/engrenagem.png")
```
```{r, out.width="900px", echo=FALSE}
knitr::include_graphics("path_root_site/_data/engrenagem2.png")
```
current code with pure HTML (another image):
<img src="path_root_site/_data/canvas.png" alt="gráfico sage" width=1000 height=500></img>
Related
I am new to R markdown and tried to use it on my computer at work. However, I was not able to change the theme or add tabs. On my personal computer, however, everything works and I get pretty HTML documents.
I used the markdown document that opens every time you open a new document. I changed the html theme to lumen and included tabs:
## I want tabs {.tabset}
### Tab 1
```{r cars}
summary(cars)
```
### Tab 2
You can also embed plots, for example:
```{r pressure, echo=FALSE}
plot(pressure)
```
#{-}
Here I have some screenshots of the tab sections:
My laptop:
My computer at work:
my computer at work is not able to create the Tabs and is als not changing the font if I change the theme... If someone has suggestions on how to fix this, that would be great!
EDIT: Could it be an issue with the path? Since IT installs R for all computers the Pathvarible instead of "C:/Programms" is "\user01\User\username\Programms" I set the global PATH of R Studio to "C:/..." but if I knit the document in R Markdown, it still uses the weird path for the library path...
I wanted to just write a comment, but I don't have enough reputation for that. You can try to remove and re-install the yaml package and see if it helps.
But it would be good to get more information from you. Do you have an older version of R in your working computer? Apparently this was a known bug back in 2018. See Tabs not rendering when knitting rmarkdown to html. In this case the problem was solved by re-installing the yaml package and installing the dev version of Rmarkdown devtools::install_github('rstudio/rmarkdown').
Edit: Trying using package flexdashboard
---
title: "My tabs"
author:
output:
flexdashboard::flex_dashboard
---
## I want tabs {.tabset}
### Tab 1
```{r cars}
summary(cars)
```
### Tab 2
You can also embed plots, for example:
```{r pressure, echo=FALSE}
plot(pressure)
```
Good luck!
How can I display DT::datatable objects from a rmarkdown script onto a pdf document? My code so far is breaks down with the following error:
processing file: reportCopy.Rmd
output file: reportCopy.knit.md
Functions that produce HTML output found in document targeting latex output.
Please change the output type of this document to HTML.
Including always_allow_html: yes in the YAML header suppresses the error, but nothing appears on the pdf.
I would be grateful for any help. My code is currently:
---
title: "DT"
output: pdf_document
---
### Chart 1
```{r}
DT::datatable(head(mtcars))
```
( I don't know if it matters, but my datatables are in fact created in a shiny application. Ideally, I would have liked to have the prerendered tables simply dumped into the rmarkdown script... but I switched tactic and now try to render the tables directly in the rmarkdown code)
Since knitr v1.13, HTML widgets will be rendered automatically as screenshots taken via the webshot package.
You need to install the webshot package and PhantomJS:
install.packages("webshot")
webshot::install_phantomjs()
(see https://bookdown.org/yihui/bookdown/html-widgets.html)
You cannot usedatatable in pdf_document (datatable is interactive, pdf is static), only in html_document!
The only possibility for PDF is to use the kable or for example pandoc.table
--> if You really wanna get the look of datatable and as You said datatable is created in a shiny application, then You can have a look at the webshot package, which is going to create a screenshot of Your datatable from shiny app which You can use further in pdf as a image.
Quick Summary
How do I place HTML files in place within an R Markdown file?
Details
I have created some nice animated choropleth maps via choroplethr.
As the link demonstrates, the animated choropleths function via creating a set of PNG images, which are then rolled into an HTML file that cycles through the images, to show the animation. Works great, looks great.
But now I want to embed / incorporate these pages within the .Rmd file, so that I have a holistic report including these animated choropleths, along with other work.
It seems to me there should be an easy way to do an equivalent to
Links:
[please click here](http://this.is.where.you.will.go.html)
or
Images:
![cute cat image](http://because.that.is.what.we.need...another.cat.image.html)
The images path is precisely what I want: a reference that is "blown up" to put the information in place, instead of just as a link. How can I do this with a full HTML file instead of just an image? Is there any way?
Explanation via Example
Let's say my choropleth HTML file lives in my local path at './animations/demographics.html', and I have an R Markdown file like:
---
title: 'Looking at the demographics issue'
author: "Mike"
date: "April 9th, 2016"
output:
html_document:
number_sections: no
toc: yes
toc_depth: 2
fontsize: 12pt
---
# Introduction
Here is some interesting stuff that I want to talk about. But first, let's review those earlier demographic maps we'd seen.
!![demographics map]('./animations/demographics.html')
where I have assumed / pretended that !! is the antecedent that will do precisely what I want: allow me to embed that HTML file in-line with the rest of the report.
Updates
Two updates. Most recently, I still could not get things to work, so I pushed it all up to a GitHub repository, in case anyone is willing to help me sort out the problem. Further details can be found at that repo's Readme file.
It seems that being able to embed HTML into an R Markdown file would be incredibly useful, so I keep trying to sort it out.
(Older comments)
As per some of the helpful suggestions, I tried and failed the following in the R Markdown file:
Shiny method:
```{r showChoro1}
shiny::includeHTML("./animations/demographics.html")
```
(I also added runtime:Shiny up in the YAML portion.)
htmltools method:
```{r showChoro1}
htmltools::includeHTML("./animations/demographics.html")
```
(In this case, I made no changes to the YAML.)
In the former case (Shiny), it did not work at all. In fact, including the HTML seemed to muck up the functionality of the document altogether, such that the runtime seemed perpetually not-fully-functional. (In short, while it appeared to load everything, the "loading" spindel never went away.)
In the latter case, nothing else got messed up, but it was a broken image. Strangely, there was a "choropleth player" ribbon at the top of the document which would work, it's just that none of the images would pop up.
For my own sanity, I also provided simple links, which worked fine.
[This link](./animations/demographics.html) worked without a problem, except that it is not embedded, as I would prefer.
So it is clearly a challenge with the embedding.
Here is a hack (probably inelegant)...idea is to directly insert HTML programmatically in Rmd and then render Rmd.
temp.Rmd file:
---
title: "Introduction"
author: "chinsoon12"
date: "April 10, 2016"
output: html_document
---
<<insertHTML:[test.html]
etc, etc, etc
```{r, echo=FALSE}
htmltools::includeHTML("test.html")
```
etc, etc, etc
test.html file:
<html>
<head>
<title>Title</title>
</head>
<body>
<p>This is an R HTML document. When you click the <b>Knit HTML</b> button a web page will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:</p>
<p>test test</p>
</body>
</html>
verbose code to replace Rmd code with HTML code and then render (can probably be shortened by a lot)
library(stringi)
subHtmlRender <- function(mdfile, htmlfile) {
#replace <<insertHTML:htmlfile with actual html code
#but without beginning white space
lines <- readLines(mdfile)
toSubcode <- paste0("<<insertHTML:[",htmlfile,"]")
location <- which(stri_detect_fixed(lines, toSubcode) )
htmllines <- stri_trim(readLines(htmlfile))
#render html doc
newRmdfile <- tempfile("temp", getwd(), ".Rmd")
newlines <- c(lines[1:(location-1)],
htmllines,
lines[min(location+1, length(lines)):length(lines)]) #be careful when insertHTML being last line in .Rmd file
write(newlines, newRmdfile)
rmarkdown::render(newRmdfile, "html_document")
shell(gsub(".Rmd",".html",basename(newRmdfile),fixed=T))
} #end subHtmlRender
subHtmlRender("temp.Rmd", "test.html")
EDIT: htmltools::includeHTML also works with the sample files that I provided. Is it because your particular html does not like UTF8-encoding?
EDIT: taking #MikeWilliamson comments into feedback
I tried the following
copied and pasted animated_choropleth.html into a blank .Rmd
remove references to cloudfare.com as I had access issues while
rendering (see below)
knit HTML
put back those cloudfare weblinks
put the graphs in the same folder as the rendered html
open the HTML
I appear to get back the html but am not sure if the result is what you expect
Are you also facing the same issue in pt 2? You might want to post the error message and ask for fixes :). This was my error message
pandoc.exe: Failed to retrieve http://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.1.1/css/bootstrap.min.css
FailedConnectionException2 "cdnjs.cloudflare.com" 80 False getAddrInfo: does not exist (error 11001)
Error: pandoc document conversion failed with error 61
Did you try the includes: option in your YAML header?
https://rmarkdown.rstudio.com/html_document_format.html#includes
But maybe you'll have the same problem I have: I'd like to include the HTML file in a specific section in my RMarkdown document, not in the header or before/after body.
can try put this line in the Rmarkdown and then knit.
(YAML header "output: html_document"; if "runtime: shiny" somehow it does not work)
There is a blog entry which describes embedding from the plotly API for R into R markdown. I just used the code to create the iframe for an html document
When I have the prieview in R studio there is no error message and the iframe is created in the html document. However, it is just empty. Apparently it does not load the content somehow. I did not create the plot in the R API beforehand (but that should not matter as this is just embedding a picture into html) isn't it?
My code in r markdown as it is is currently
```{r}
library("knitr")
library("devtools")
url<-"https://plot.ly/~etpinard/251"
plotly_iframe <- paste("<iframe scrolling='no' seamless='seamless' src='", url,
"/800/600' width='800' height='600'></iframe>", sep = "")
```
`r I(plotly_iframe)`
We had this same issue the first time we published an RPub. Here is your code in a published RPub.
Once it's published at RPubs.com rather than in preview, the graphs should show up. You can test it by using the "open in browser" option in RPubs:
A note. I changed height to 800 and width to 650, as that graph is a bit tall. I also added a <center> tag to place it in the center of the published version.
Plotly also has a target URL for embedding. In this case, it's https://plot.ly/~etpinard/251.embed. RPubs doesn't seem to like that though. You also might play around with borderwidth to see if you can turn off the border.
That's all to say: the graphs won't show up in the preview. I believe this is a browser limitation, as RStudio doesn't allow for publishing live web content (yet).
If you're interested and would like some example code, here is the source for a blog post that has embedded Plotly and ggplot2 plots. Hope this helps! Disclosure: I work for Plotly.
Update: Aug. 21, 2015
Head to the Plotly documentation to see the R Markdown version of this answer. Printing plotly objects in the R console creates an online figure. For example:
p <- plot_ly(economics, x = date, y = uempmed, filename="r-docs/knitr-example")
If you are using knitr/R Markdown with HTML output, printing the plotly object will now embed the plot in the HTML as an iframe. If you are writing a document with R Markdown, simply printing p will embed the plot.
You can also set the width and the height of the plot with width and height code chunk parameters. For example: {r, height=800} sets the height.
If you are using Plotly Offline with R Studio, then printing the plotly object in knitr will also include the necessary plotly.js files to draw the graph: the graph is rendered locally inside the document.
To convert the knitr document to a standalone HTML file, use knitr::knit and markdown::markdownToHTML. For example:
knitr::knit('plotly-report.Rmd', 'plotly-report.md')
markdown::markdownToHTML('plotly-report.md', 'plotly-report.html')
I had to add a ".embed?width=550&height=550" after my url to make it work. See below
```{r}
library("knitr")
library("devtools")
url<-"https://plot.ly/yourplothere.embed?width=550&height=550"
plotly_iframe <- paste("<center><iframe scrolling='no' seamless='seamless' style='border:none' src='", url,
"/800/1200' width='800' height='1200'></iframe><center>", sep = "")
```
`r I(plotly_iframe)`
I would like to build an HTML in the same way that a package build makes Rmd files into self contained HTML files. It even takes an image referenced from an external file (say a png file) and converts it to something like the following:
<div style="width:367.5px;margin:auto;">
<p><img
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAhkAAAGpCAYAAAAgOC
RjAAAABmJLR0QA/wD/AP+gvaeTAAAgAElE
ABOUT_1_TRILLION_SEEMINGLY_RANDOM_CHARACTERS_xdfhf" width="350"
height="250"></p>
</div>
I know this to be the case because I use an external file ![](imgs/tm_imgs/img2.png) and it renders in the doc directory as the code above. This tells me that buildVignettes used in R CMD build is converting/encode these external files to the base64. I can almost mimic the behavior of the R CMD build vignettes except the external images using:
MWE
dir.create("delete_me")
setwd("delete_me")
dir.create("imgs")
dir.create("output")
png("imgs/fake_external_file.png")
plot(1:10)
dev.off()
x <- readLines(n=13)
```{r setup, include=FALSE}
library(knitr)
opts_chunk$set(cache=FALSE, tidy=FALSE, warning=FALSE)
opts_knit$set(upload.fun = image_uri, self.contained=TRUE)
```
```{r}
plot(cars);lines(lowess(cars))
```
![](imgs/fake_external_file.png)
The End
cat(paste(x, collapse="\n"), file="test.Rmd")
knitr::knit2html("test.Rmd", output = "output/test.html",
options=c("base64_images"))
But then I open the HTML file and only see (missing second external image):
Because the html source is still:
<p><img src="imgs/fake_external_file.png" alt=""></p>
rather than the base64 encoded.
Question
How can I make knitr and/or markdown packages behave in the same manner as R CMD build for making external images self contained with the base64 encoding? If someone has a different angle than the suggested knitr and/or markdown and an external package is necessary it would need to be CRAN.
When your output contains external dependencies generated from R code, you are strongly recommended not to write the output file to a different directory, because the structure of relative paths may confuse several tools in the chain, including knitr, markdown, Pandoc, LaTeX, and so on. This has been documented in the Note section in ?knitr::knit. A short answer to this question is
setwd('output')
knit2html('../test.Rmd')
Note the output argument is passed to knit() (as documented in knitr::knit2html), so foo.html is actually not appropriate (foo.md is). Yes, I know this is confusing, and naturally users expect the output argument for knit2html() to be a HTML file.
A slightly longer answer and explanation: in your case, by imgs/fake_external_file.png, you mean it is relative to output/test.html, i.e. it is output/imgs/fake_external_file.png, but actually this image is under your working directory ./ instead of ./output/. The reason that the plot from the code chunk works is that the plot is written to figure/foo.png relative to the current working directory. To avoid the pain of thinking relative directories (relative to which?), just set the working directory to the directory in which you want to generate output, and use a single relative path for the input file. You rarely need to set the output argument unless you want to change the basename of the output file (e.g. knit('foo.Rmd', output = 'bar.md')).
Here's one approach I got by looking at image_uri, but I'm hoping for a better approach:
dir.create("delete_me")
setwd("delete_me")
dir.create("imgs")
dir.create("output")
png("imgs/fake_external_file.png")
plot(1:10)
dev.off()
x <- readLines(n=19)
```{r setup, include=FALSE}
library(knitr)
opts_chunk$set(cache=FALSE, tidy=FALSE, warning=FALSE)
opts_knit$set(upload.fun = image_uri, self.contained=TRUE)
uri_embed <- function(path) {
uri <- knitr::image_uri(path)
cat(paste0("<img src=\"", uri, "\" />"))
}
```
```{r}
plot(cars);lines(lowess(cars))
```
```{r, echo=FALSE, results='asis'}
uri_embed("imgs/fake_external_file.png")
```
The End
cat(paste(x, collapse="\n"), file="test.Rmd")
knitr::knit2html("test.Rmd", output = "output/test.html",
options=c("base64_images"))