我创建了一个带有svg
数字的编织文档,以跟踪从提交到提交的任何视觉变化。我遇到的主要问题是,更改图表的顺序会更改.svg文件的ID。
例如,考虑以下编织:
\documentclass{article}
\begin{document}
<<knitropts>>=
library(knitr)
library(ggplot2)
opts_chunk$set(fig.path = "svg-differ/",
dev = c("svg", "pdf"),
fig.ext = c("svg", "pdf"))
set.seed(1)
@
<<chart>>=
set.seed(1)
x <- seq(0, 1, length.out = 1000)
y <- -2 * sin(10 * x) + 3 * x^2 - 2 * x
qplot(x, y, geom = "smooth")
@
<<chart-2>>=
x <- sample(seq(0, 1, length.out = 1000))
y <- -2 * sin(10 * x) + 3 * x^2 - 2 * x
qplot(x, y, geom = "smooth")
@
\end{document}
如果我切换chart
和chart-2
块的顺序,则.svg文件是相同的,除了一行:
<g id="surface1">
和<g id="surface6">
是否有一种方法可以使svg
文件创建为(完全)相同,直到重新排序块?我知道,如果要在同一个HTML文件中包含多个svg,则这些ID的顺序排序很重要,但是就我的目的而言,这并不重要。
答案 0 :(得分:1)
我认为在R的svg()
驱动程序中将id设置为相当低的水平,并且没有明显的方法来对其进行更改。但是,您可以在使用图钩生成图形之后进行更改。例如,将其放在文档的knitr选项块中:
<<knitropts>>=
library(knitr)
library(ggplot2)
opts_chunk$set(fig.path = "svg-differ/",
dev = c("svg", "pdf"),
fig.ext = c("svg", "pdf"))
set.seed(1)
oldhook <- knitr::knit_hooks$get("plot")
newhook <- function(x, options) {
lines <- readLines(x)
lines <- sub('<g id="surface[[:digit:]]+">',
'<g id="surface">', lines)
writeLines(lines, x)
oldhook(x, options)
}
knitr::knit_hooks$set(plot = newhook)
@
这会将图输出文件中的所有字符串,例如<g id="surface##">
更改为<g id="surface">
。您可能需要使其更加复杂。例如,它仅应尝试对svg文件进行处理,并且可能使用其他ID会更好。