我一直在使用带有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}

相反,它失败并显示消息Error in UseMethod("depth"): no applicable method for 'depth' applied to an object of class "NULL"。在R中执行代码或选择png设备将得到预期的图形。忽略色彩美学或分解c也可以与tikzDevice一起使用,因此连续的色标似乎是问题所在。

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

最佳答案

通过将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")

工作良好。

我还注意到,如果通过(原始)代码上的事件R session 调用knit(),我将拥有一个事件的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()

10-02 09:48