2015-10-02 20 views
7

SynopsisDzianina pdf ze skryptu RMD klikając plik wykonywalny r

wuold Chciałbym stworzyć plik PDF z poziomu skryptu RMD prostu klikając na ikonę pliku/tak, że moi współpracownicy nie wyczerpują się otwierając najpierw RStudio.

Pytanie

Kiedy zobaczyłem this na prace badawczo-blogerów i dostał to działa, myślałem, że zbliża się do idealnego przepływu pracy ze skryptów do dzielenia się moją pracę, pozwalając moich współpracowników wykonać plik i dostać w rezultacie plik pdf ze zaktualizowanymi liczbami. Jednak nie mogę go uruchomić z niektórymi funkcjami w bibliotece knitr.

Najlepszy scenariusz jest to, że to pytanie jest ciekawe, tylko niewielu z was tam, ale tu idzie:

Poniżej można zobaczyć skrypt w pliku o nazwie RexecKnit.Rmd. Jedyny powód, dla którego tam jest, więc możesz przetestować całą procedurę dla siebie, jeśli chcesz. Nawiasem mówiąc, używam RStudio w wersji 0.99.467 na 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) 
``` 

wiem, że to dość długi skrypt dla celów testowych, ale to, aby upewnić się, że wszystko działa, kiedy wykonać skrypt po podwójnym kliknięciu tego trochę urody .Rexe który jest plikiem o nazwie rozmówca knitr.Rexe (podobnie jak w post-R blogerów) zawierający ten kawałek kodu:

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

I to działa zgodnie z oczekiwaniami. Po podwójnym kliknięciu pliku skrypt jest uruchamiany bez otwierania R lub Rstudio, a plik .md jest tworzony w wybranym folderze. Ten sam skrypt działa, gdy jest przechowywany jako plik .Rexe i jako plik .R. Ale tutaj jest problem:

Chcę produkować PDF i zgodnie z końcówką here, zastępując

knit('RexecKnit.Rmd') 

z

rmarkdown::render("RexecKnit.Rmd") 

powinno załatwić sprawę tak długo, jak w nagłówku YAML obejmuje to:

output: pdf_document 

I ma rk (co oznacza, że ​​plik pdf jest tworzony z każdym szczegółem określonym w dłuższym skrypcie), przynajmniej gdy jest uruchamiany jako plik .R. ku mojemu rozczarowaniu, to nie działa, gdy jest on uruchamiany z .Rexec pliku tak:

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

Dziękuję, że spojrzeć na to!

Odpowiedz

2

Zakładając jeden jest niezależnie zainstalowane pandoc na Windows maszyny (który okazał się być główny problem w tym przypadku), może to zrobić w następujący sposób:

Pierwszy: zrobić .R plik z treścią jak poniżej

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) 

II: make plik .bat

Utwórz plik .bat, powiedz "my_bat_file.bat" i dołącz poniższy tekst. Jednak ścieżki muszą być dostosowane:

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

trzecie: poinstruować Windows Task Scheduler

Jeśli dane są często aktualizowane, można shedule Harmonogram zadań w systemie Windows do wielokrotnego wykonywania pliku .bat raz w tygodniu o określonej porze, więc rano są raporty.

+0

Twoja sugestia działa tak samo, jak robi to rmarkdown :: render ("RexecKnit.Rmd"). Działa jako plik .R, ale nie jako plik .Rexec. – vestland

+0

Edytowałem odpowiedź. –

+0

Nie jestem pewien, do czego służy plik "C: \ ścieżka_do_twoja_pliku \ twój_pliku.Rout", ale teraz go odpalam. – vestland