Is ggplot2's continuous color scale incompatible with knitr's tikzDevice?

I've been using knitr with R base graphics and tikz output for a while now, and wanted to try out ggplot2 instead. However, this minimal example fails to produce any output with 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}

Instead, it fails with the message Error in UseMethod("depth"): no applicable method for 'depth' applied to an object of class "NULL". Executing the code in R or choosing the png device will result in the expected graph. Omitting the color aesthetics or factoring c work with tikzDevice as well, so the continuous color scale seems to be the problem.

Is there anything I am doing wrong, or is that a bug?

Answers


I can get tikzDevice to work with your code by adding dev.off() to the end of the code block. For example:

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")

works fine.

I have also noticed that if calling knit() through an active R session on the (original) code, I am left with an active tikz device ...

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()

This was a bug, now resolved in the development version 0.10 of tikzDevice, which will hit CRAN soon. Until then, install using

devtools::install_github("yihui/tikzDevice")

Need Your Help

Global reach of char *argv[ ] and int argc C++

c++ c variables main

I've got the main function: main(int argc, char *argv[]). I want to use these variables: argc,argv in other function:

How to run Java application on startup of Ubuntu Linux

java linux sockets ubuntu init

I have a requirement where I need to develop application that reads TCP/IP Socket. I successfully made the program as Java program with No GUI means as soon as program runs it starts listening to the