Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

include an rCharts into a pdf repport #105

Open
danreb25 opened this issue Mar 24, 2014 · 1 comment
Open

include an rCharts into a pdf repport #105

danreb25 opened this issue Mar 24, 2014 · 1 comment

Comments

@danreb25
Copy link

It's OK to generate html repports (cf #104) that include rCharts objects (tested with Highcharts charts).

But what if we would like to include rCharts generated plots into a pdf file?
In other words: can we include iframes withraw html (or inline raw html) in the brew code and produce it in the pdf generated repport?

e.g.
in the template we write something like

# test Highcharts
<%=
require(rCharts);
a <- hPlot(Pulse ~ Height, data = MASS::survey, type = "bubble", title = "Zoom demo", subtitle = "bubble chart", size = "Age", group = "Exer");
a <-gfa.rcharts.customiser.addaptLibUrlToLocalEnvironment(a,newPathPart =CST_R_CHARTS_LIBRARY );
myChartId<-  "testRapportrCharts";
myFile<-file.path('I:/Myproject','rchartsOut/');
knitr::opts_current$set(list(fig.path = myFile, label = myChartId))
save_stdout(a$show('iframe', cdn  = TRUE, standalone = TRUE));
%> 

it produces something like the following in the *.md generated file

<iframe src='file:///I:/Myproject/rchartsOut/testRapportrCharts.html' 
class='rChart highcharts '
id=iframe_chart170c37b73e76
></iframe>
<style>iframe.rChart{ width: 100%; height: 400px;}</style>

wich isn't converted in pdf (and no erro , no warnings).

Thanks for your comments

@danreb25
Copy link
Author

my solution at this time (code still needs to be cleaned and re-tested) is deduced from the links anottated in the issue ramnathv/rCharts#385:

N.B.: needs to instal

  • casperjs
  • phantomjs

here is my template code

<%
# --------------------------------------------
# function definition
# --------------------------------------------
gfa.rcharts.customiser.addaptLibUrlToLocalEnvironment<-function (
        rChart=NULL
        ,oldPathPart=paste("C:/Program Files/R/R-",paste(R.version$major,R.version$minor,sep='.'),"/library/rCharts/libraries",sep="")
        ,newPathPart=file.path( "..","libraries/rCharts/libraries") 
){
    rChart$LIB$url<-gsub(oldPathPart,newPathPart,rChart$LIB$url,fixed = TRUE);
    return (rChart);
}

save_stdout <- function(x){
    paste(capture.output(x), collapse = '\n')
}

gfa.rcharts.save.wrapper <- function (myRchart=a,  myChartName=NULL , myDestDir=file.path(MY_SLIDIFY_PROJECT_DIR,'rchartsOut') ,withImage=F
                , with_relative_paths=F
                , showMethod=NULL
                ) {

    result<-NULL;

    #on s'assure qu'il n'y ait pas d'extention au nom de fichier                        
    myChartName<-tools::file_path_sans_ext(myChartName)

    # verification/creation du repertoire de destination
    if (!file.exists( myDestDir)){
        dir.create(myDestDir,showWarnings = FALSE);
    }

    destfile<-file.path(myDestDir,paste(myChartName,'.html',sep=''));

    # sauvegarde du fichier
    myRchart$save(  destfile = file.path(destfile));

    #generation d'une image si necessaire
    if (withImage){
        imgFilePath<-gfa.rcharts.save.take_screenshot (src=destfile, imgname = myChartName, delay = 10000, upload = F,isURL=F , dirOut=myDestDir);
        result<-imgFilePath;

    }

    # specific show methods?
    if (!is.null(showMethod)){
        require('knitr');
        switch (showMethod,
                iframe={        
                    knitr::opts_current$set(list(fig.path = myDestDir, label = myChartName));
                    result<-gfa.console.utils.save_stdout(a$show('iframe', cdn  = TRUE, standalone = TRUE));
                },
                inline={        
                    knitr::opts_current$set(list(fig.path = myDestDir, label = myChartName));
                    result<-gfa.console.utils.save_stdout(a$show('inline', include_assets = TRUE, standalone = TRUE)) # OK
                },
                {#default
                    print( paste('gfa.rcharts.save.wrapper function executed with [',showMethod,'] showMethod parameter, hence the show methods is nott executed' , sep =" ")  )
                    result<-NULL;
                }
        );
    }
    return(result);
}

#' Automate screenshot of an rChart, optionally upload it to imgur
#'  addapted from https://github.com/ramnathv/rCharts/blob/b6246d3a4a47c26a8c1023178a83a4e35959bd2c/R/makeExamples.R
#' @param path to R file containing code to create an rChart
#' @param imgname name of the plot to save to
#' @return generated image path
#' Necessite l'installation de phantomjs et de casperjs et de ImageMagick
#' Example : gfa.rcharts.save.take_screenshot(mydestfile, tools::file_path_sans_ext(myChartId));
gfa.rcharts.save.take_screenshot <- function(src, imgname = 'plot1', delay = 10000, upload = F,isURL=F,dirOut=NULL){

    if (tools::file_ext(src) %in% c('r', 'R')){
        rCode = paste(readLines(src, warn = F), collapse = "\n");
        chart = source(src, local = TRUE)$value;
        chart$set(width = 600, height = 325);
        tf <- tempfile(fileext = ".html"); on.exit(unlink(tf));
        chart$save(tf);
    } else {
        if (isURL){
            tf <- src;
        }else {
            tf <- paste('file:///',src,sep='');
        }
    }

    if (is.null(dirOut )){
        wd<-getwd();
    }
    else {
        wd<-dirOut;
    }
    generatedImgFilePath<-file.path(wd , paste(imgname,'.png',sep="") );

    # the original needs to be copied into a location whitout spaces in the path
#   file.copy(from= system.file('utils', 'screenshot.js', package = 'rCharts')
#           , to=file.path( .ROOT,'js','screenshot.js')
#           ,overwrite  = TRUE);
    #script = system.file('utils', 'screenshot.js', package = 'rCharts')
    # at this time I am using a custom script to be sure about the image generation directory
    # until https://github.com/ramnathv/rCharts/issues/387 is taken into account
    script = file.path( .ROOT,'js','screenshot.js');
    cmd1 <- sprintf('casperjs %s %s %s %s %s', script, tf, imgname, delay,wd);
    system(cmd1);

    #cmd2 <- sprintf('convert -flatten %s.png %s.png', imgname, imgname)
    # TODO , je vois pas a quoi ca peut servir??? sauf s'il s'agit de faire une modif format?
    cmd2 <- sprintf('convert -flatten %s.png %s.png', file.path(wd ,imgname ), file.path(wd,imgname  ));
    system(cmd2);
    # system(sprintf("convert %s.png -resize 288x172", file.path(wd ,imgname )))
    if (upload){
        h = knitr:::imgur_upload(paste0(imgname, '.png'));
        return(h[1]);
    } else {
        #return(imgname)
        return(generatedImgFilePath);
    }
}
%>

<!--
============================================
Template generation code
============================================
-->

# test Highcharts
<%=
#https://github.com/ramnathv/rCharts/issues/373
require(rCharts);
a <- hPlot(Pulse ~ Height, data = MASS::survey, type = "bubble", title = "Zoom demo", subtitle = "bubble chart", size = "Age", group = "Exer");
a <-gfa.rcharts.customiser.addaptLibUrlToLocalEnvironment(a,newPathPart =CST_R_CHARTS_LIBRARY );

myChartId<-  "testRapportrCharts";
myFile<-file.path(fRp,'rchartsOut');

if (isForPdf){
    # sauvegarde avec image
    gfa.rcharts.save.wrapper ( myRchart = a,myChartName = myChartId,myDestDir = myFile,withImage = isForPdf);
}else{
    gfa.rcharts.save.wrapper ( myRchart = a,myChartName = myChartId,myDestDir = myFile,withImage = F,showMethod='iframe');
}

%> 

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant