Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Missic R CMD build HTML vignette:将外部图像嵌入为自包含的_Html_R_Image_Knitr - Fatal编程技术网

Missic R CMD build HTML vignette:将外部图像嵌入为自包含的

Missic R CMD build HTML vignette:将外部图像嵌入为自包含的,html,r,image,knitr,Html,R,Image,Knitr,我希望以与包构建相同的方式构建HTML,将Rmd文件转换为自包含的HTML文件。它甚至从外部文件(例如png文件)中引用图像,并将其转换为以下内容: <div style="width:367.5px;margin:auto;"> <p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAhkAAAGpCAYAAAAgOC RjAAAABmJLR0QA/wD/AP+gvaeTAAAgA

我希望以与包构建相同的方式构建HTML,将Rmd文件转换为自包含的HTML文件。它甚至从外部文件(例如png文件)中引用图像,并将其转换为以下内容:

<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>
但随后我打开HTML文件,只看到(缺少第二个外部图像):

因为html源仍然是:

<p><img src="imgs/fake_external_file.png" alt=""></p>

而不是base64编码

问题


如何使
knitr
和/或
markdown
软件包的行为方式与
R CMD build
相同,以便使用base64编码使外部图像自包含?如果某人的角度与建议的
knitr
和/或
markdown
不同,并且需要一个外部包,则需要使用CRAN。

以下是我通过查看得到的一种方法,但我希望有一种更好的方法:

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"))
dir.create(“删除我”)
setwd(“删除我”)
创建目录(“imgs”)
目录创建(“输出”)
png(“imgs/fake_external_file.png”)
绘图(1:10)
发展主任()

x当输出包含由R代码生成的外部依赖项时,强烈建议不要将输出文件写入其他目录,因为相对路径的结构可能会混淆链中的几个工具,包括knitrmarkdown、Pandoc、LaTeX等。这已记录在
?knitr::knit
的注释部分中。这个问题的简短回答是

setwd('output')
knit2html('../test.Rmd')
注意,
output
参数被传递到
knit()
(如
knitr::knit2html
中所述),因此
foo.html
实际上是不合适的(
foo.md
是)。是的,我知道这很混乱,用户自然希望
knit2html()
output
参数是HTML文件

一个稍微长一点的回答和解释:在你的例子中,通过
imgs/fake_external_file.png
,你的意思是它相对于
output/test.html
,也就是说它是
output/imgs/fake_external_file.png
,但实际上这个图像在你的工作目录下
/
。代码块中的绘图有效的原因是,相对于当前工作目录,绘图被写入
figure/foo.png
。为了避免考虑相对目录(相对于哪个?)的痛苦,只需将工作目录设置为要在其中生成输出的目录,并为输入文件使用单个相对路径。除非要更改输出文件的基本名称(例如,
knit('foo.Rmd',output='bar.md')
),否则很少需要设置
output
参数

setwd('output')
knit2html('../test.Rmd')