2015-10-02 16 views
7

Sinossipdf Knit dallo script rmd facendo clic su un file eseguibile r

Mi piace wuold per produrre un file pdf da uno script rmd semplicemente facendo clic su un file/un'icona in modo che i miei colleghi non si esauriscono aprendo prima RStudio.

La domanda

Quando ho visto this su R-blogger, e ottenuto che funziona, ho pensato che mi stavo avvicinando il flusso di lavoro perfetto da script per condividere il mio lavoro lasciando i miei colleghi eseguire un file e ottenere un pdf con numeri aggiornati come risultato. Tuttavia, non riesco a farlo funzionare con alcune delle funzioni nella libreria knitr.

Migliore delle ipotesi è che questa domanda è interessante solo pochi di voi là fuori, ma qui va:

Qui sotto potete vedere uno script in un file chiamato RexecKnit.Rmd. L'unica ragione per cui è lì è che puoi testare l'intera procedura per conto tuo se vuoi. A proposito, sto usando RStudio Versione 0.99.467 su Windows 7, 64 bit.

--- 
title: "Executable R, rmd and pdf" 
header-includes: \usepackage{caption} \usepackage{fancyhdr} 
output: pdf_document 
fig_caption: no 
--- 

\addtolength{\headheight}{0.5cm} 
\pagestyle{fancyplain} 
\renewcommand{\headrulewidth}{0pt} 

```{r Settings, echo = FALSE, eval = TRUE, results = "hide", warning = FALSE, message = FALSE} 
rm(list=ls()) 

pck_loaded <- (.packages()) 

# Packages to load 
pck_toload <- c('ggplot2', 'xts', 'quantmod', 'zoo', 'PerformanceAnalytics', 
      'tseries', 'mvtnorm', 'data.table', 'XLConnect', 'sqldf', 'stargazer', 'xtable', 'gridExtra', 'grid', 'TTR') 

# Load packages 
for(i in 1:length(pck_toload)) { 
    if (!pck_toload[i] %in% pck_loaded) 
    print(pck_toload[i]) 
    library(pck_toload[i], character.only = TRUE) 
} 

``` 

\captionsetup[table]{labelformat=empty} 

```{r repex1, echo = FALSE, eval = TRUE, results = "asis", warning = FALSE, message = FALSE, fig.width = 12, fig.height = 8} 

# Data table with formatted numbers and text 
v1 <- c("\\colorbox{white}{0.05}" , "\\colorbox{yellow}{0.57}", "\\colorbox{red}{-0.99}") 
v2 <- c("An unexpected comment", "A qurious question", "And an insightful answer") 
dt1 <- data.table(v1,v2) 

# Data table using xtable 
print(xtable(dt1, 
     caption = 'Fancy table'), 
     caption.placement = 'top', 
     comment = FALSE, 
     sanitize.text.function = function(x) x) 
``` 

```{r repex2, echo = FALSE, eval = TRUE, results = "asis", warning = FALSE, message = FALSE, fig.width = 12, fig.height = 8} 

# Data table wiht random numbers 
dt2 <- data.table(replicate(2,sample(0:100,10,rep=TRUE))) 

# ggplot of random numbers 
plx <- ggplot(data=dt2 ,aes(x=V1, y = V2)) 
plx <- plx + geom_line(color = 'blue', fill = 'grey') 
plx <- plx + theme_classic() 
plx <- plx + labs(title="Random numbers", x="x-axis",y="y-axis") 
plot(plx) 
``` 

So che è uno script abbastanza lunga a scopo di test, ma è solo per assicurarsi che tutto funzioni quando eseguo lo script su un doppio clic questa piccola bellezza .Rexe che è un file chiamato chiamante knitr.Rexe (come nel post R-Bloggers) contenente questo piccolo pezzo di codice:

library(knitr) 
library(rmarkdown) 
setwd('C:/repos/r_tutorials/executable R files') 
knit('RexecKnit.Rmd') 
Sys.sleep(3) 

E questo funziona come previsto. Facendo doppio clic sul file, lo script viene eseguito senza aprire R o Rstudio e un file .md viene prodotto nella cartella desiderata. E lo stesso script funziona quando è memorizzato come file .Rexe e come file .R. Ma ecco il problema:

voglio produrre un pdf, e in base ad una punta here, sostituendo

knit('RexecKnit.Rmd') 

con

rmarkdown::render("RexecKnit.Rmd") 

dovrebbe fare il trucco fino a quando l'intestazione YAML include questo:

output: pdf_document 

E fa wo rk (il che significa che il pdf viene creato con ogni dettaglio specificato nello script di lunghezza), almeno quando viene eseguito come file .R. Per la mia delusione, ma non funziona quando viene eseguito da un file .Rexec come questo:

library(knitr) 
library(rmarkdown) 
setwd('C:/repos/r_tutorials/executable R files') 
rmarkdown::render("RexecKnit.Rmd") 
Sys.sleep(3) 

Grazie per avere uno sguardo a questo!

risposta

2

Supponendo che si è installato in modo indipendente pandoc su Windows macchina (che si è rivelato essere la radice del problema in questo caso), può farlo nel seguente modo:

Prima: fare una .R file con il contenuto come qui di seguito

library(knitr) 
library(rmarkdown) 
setwd('C:/repos/r_tutorials/executable R files') 
knit("RexecKnit.Rmd") 

# render the generated markdown file. 
render("RexecKnit.md") 

Sys.sleep(3) 

seconda: rendere un file .bat

Creare un file .bat, pronunciare "my_bat_file.bat" e includere il testo qui sotto. Tuttavia, i percorsi devono essere regolati:

"C:\R\R-3.2.2\bin\x64\R.exe" CMD BATCH --vanilla --slave "C:\path_to_your_file\your_file.R" "C:\path_to_your_file\your_file.Rout" 

Terzo: Istruire Windows Task Scheduler

Se i dati vengono aggiornati di frequente, si può shedule l'Utilità di pianificazione di Windows per eseguire ripetutamente il file .bat una volta alla settimana a certe ore della notte, così i rapporti sono lì al mattino.

+0

Il tuo suggerimento funziona allo stesso modo di rmarkdown :: render ("RexecKnit.Rmd"). Funziona come un file .R, ma non come un file .Rexec. – vestland

+0

Ho modificato la risposta. –

+0

Non sono sicuro di cosa sia "C: \ path_to_your_file \ your_file.Rout", ma ci sto provando ora. – vestland