Goal
Export a ggvis
figure as a PNG file (for inclusion in an .Rmd document).
Problem
I know essentially nothing about Node.js, other than that it is great and I should know more.
I get as far as:
library(ggvis)
mtcars %>% ggvis(~mpg, ~wt) %>% export_png()
Writing to file plot.png
Guessing layer_points()
module.js:340
throw err;
^
Error: Cannot find module 'd3'
at Function.Module._resolveFilename (module.js:338:15)
at Function.Module._load (module.js:280:25)
at Module.require (module.js:364:17)
at require (module.js:380:17)
at Object.<anonymous> (/usr/local/src/vega/index.js:11:6)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:364:17)
Setup
Platform
- OS X Mavericks (10.9.5)
- RStudio (0.98.945)
- Used
devtools::install_github("hadley/ggvis")
to installggvis
(0.3.0.9001) and dependencies - Cloned
https://github.com/trifacta/vega
to/usr/local/src/vega
- Symlinked
./bin/vg2png -> /usr/local/src/vega/bin/vg2png
sessionInfo()
sessionInfo()
R version 3.1.0 (2014-04-10)
Platform: x86_64-apple-darwin13.1.0 (64-bit)
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] graphics grDevices utils datasets stats methods base
other attached packages:
[1] knitr_1.6 pander_0.3.8 ggvis_0.3.0.9001 lubridate_1.3.3 dplyr_0.2.0.9001 plyr_1.8.1 stringr_0.6.2 ggplot2_1.0.0 devtools_1.5
loaded via a namespace (and not attached):
[1] assertthat_0.1 bitops_1.0-6 caTools_1.17 colorspace_1.2-4 DBI_0.3.0 digest_0.6.4 evaluate_0.5.5 formatR_0.10 grid_3.1.0
[10] gtable_0.1.2 htmltools_0.2.4 httpuv_1.3.0 httr_0.5.0.9000 jsonlite_0.9.11 lazyeval_0.1.1 magrittr_1.0.1 MASS_7.3-33 memoise_0.2.1
[19] munsell_0.4.2 parallel_3.1.0 proto_0.3-10 Rcpp_0.11.2 RCurl_1.95-4.3 reshape2_1.4 RJSONIO_1.3-0 scales_0.2.4 shiny_0.10.1
[28] tools_3.1.0 whisker_0.3-2 xtable_1.7-3
There are a few moving targets which need to be pinned down to get ggvis and the export_ tools working.
Vega 2+ series releases don't accept the json ggvis generates for the vg2XXX commands, which are used for the exporting, so vega needs to be pinned to v1.5.4 which is the last of the v1 series. The problem with that is nodejs 4.x+ wont install vega@1.5.4 and requires the newer vega versions. Thankfully we can use node version manager (nvm) to pin the node version to node 0.12.7 which allows us to install vega.
What a PITA, yes? If you do this within a scriptable container (like with a Rocker container) environment it is much easier. I've been using a Rstudio setup that includes this dockerfile containing these pertinent lines...
RUN \
# Vega 2 doesn't accept the json ggvis generates when trying to use vg2XXX
# commands so vega needs to be pinned. nodejs 4.x wont install vega@1.5.4...
mkdir .local/lib/nvm; \
ln -s .local/lib/nvm .nvm; \
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.29.0/install.sh | bash; \
. .nvm/nvm.sh; \
sudo bash -c ". .nvm/nvm.sh;\
nvm install 0.12.7;\
nvm alias default 0.12.7;\
npm install --silent vega@1.5.4;"; \
ln -s -t ~/.local/bin ~/node_modules/vega/bin/*
来源:https://stackoverflow.com/questions/25999741/getting-ggvisexport-png-working