12

我一直在使用带有 R 基础图形和 tikz 输出的 knitr 一段时间,并想尝试一下ggplot2。但是,这个最小的示例无法使用 knitr 1.0.5 生成任何输出:

\documentclass{article}
\begin{document}
<<dev = 'tikz'>>=
library(ggplot2)
d = data.frame(a = c(1, 2, 3), b = c(4, 5, 6), c = c(7, 8, 9))
ggplot(d, aes(a, b, color = c)) + geom_point()
@
\end{document}

相反,它失败并显示 message Error in UseMethod("depth"): no applicable method for 'depth' applied to an object of class "NULL"。在 R 中执行代码或选择 png 设备将产生预期的图形。也省略了 tikzDevice 的颜色美学或分解c工作,因此连续色标似乎是问题所在。

有什么我做错了,还是一个错误?

4

2 回答 2

6

我可以tikzDevice通过添加dev.off()到代码块的末尾来处理您的代码。例如:

cat("
    \\documentclass{article}
    \\begin{document}
    <<dev = 'tikz'>>=
    library(ggplot2)
    d = data.frame(a = c(1, 2, 3), b = c(4, 5, 6), c = c(7, 8, 9))
    ggplot(d, aes(a, b, color = c)) + geom_point()
    dev.off()
    @
    \\end{document}
", "test_works.Rtex")
knit("test_works.Rtex")

工作正常。

我还注意到,如果knit()通过(原始)代码上的活动 R 会话调用,我会留下一个活动的 tikz 设备......

cat("
    \\documentclass{article}
    \\begin{document}
    <<dev = 'tikz'>>=
    library(ggplot2)
    d = data.frame(a = c(1, 2, 3), b = c(4, 5, 6), c = c(7, 8, 9))
    ggplot(d, aes(a, b, color = c)) + geom_point()
    @
    \\end{document}
    ", file = "test_fails.Rtex")
knit("test_fails.Rtex")
dev.list()
于 2013-08-26T00:03:30.507 回答
2

这是一个错误,现已在 0.10 的开发版本中解决,tikzDevice很快就会出现在 CRAN 中。在那之前,安装使用

devtools::install_github("yihui/tikzDevice")
于 2016-02-03T13:12:10.100 回答