2016-06-13 21 views
2

Ich versuche eine Shiny-App zu erstellen und sie auf dem Shiny-Server meines Unternehmens zu hosten, der einen eingegebenen Lagercode verwendet und daraus Daten aus unserer Datenbank abruft und eine Reihe von Grafiken generiert und Tabellen im Abschriften- (.md) oder Wort- (.doc) Format. Idealerweise hätte ich drei Dateien für diese App: Server, ui und die Abzeichnungsvorlage.Übergabe einer Shiny-Eingabe an R Markdown über Shiny Server

Ich habe derzeit eine funktionierende App, die SWeave verwendet, aber TeX-Dateien haben Probleme beim Rendern chinesischer Zeichen, also würde ich gerne RMD verwenden.

server.r:

library(knitr) 
shinyServer(function(input, output) { 
output$report = downloadHandler(
     filename = 'myreport.pdf', 
     content = function(file) { 
      out = knit2pdf('input.Rnw', clean = TRUE) 
      file.rename(out, file) # move pdf to file for downloading 
     }, 
     contentType = 'application/pdf' 
) 
}) 

ui.r:

library(shiny) 
shinyUI(basicPage(
textInput('stockcode', 'Stock Code:', value = '600340.SH'), 
downloadButton('report') 
)) 

input.Rnw:

\documentclass{article} 

\begin{document} 
\SweaveOpts{concordance=TRUE} 

<<initialize, echo = FALSE, results = 'hide'>>= 
library(ggplot2); library(RJDBC); library(gridExtra) 
Sys.setlocale("LC_CTYPE", "chinese") 
o.drv <- JDBC("oracle.jdbc.OracleDriver", classPath="C:/Oracle/instantclient_11_2/ojdbc5.jar", " ") 
o.con <- dbConnect(o.drv, "database_address", "database_user", "database_pw") 

stockcode <- input$stockcode 

x <- dbGetQuery(o.con, "some_query") 

pointLinePlot <- function(df) { 
     plotdata <- gather(df, metric, measure, -reportDate) 
     ggplot() + geom_line(data = plotdata, aes(x = reportDate, y = measure, color = metric)) + 
      geom_point(data = plotdata, aes(x = reportDate, y = measure, color = metric)) + 
      theme(legend.position="bottom", legend.title = element_blank()) + 
      scale_color_manual(name = "", values = c("darkred", "darkgreen", "darkblue", "orange"), 
           breaks = unique(plotdata$metric), labels = unique(plotdata$metric)) 
} 

data_1.1.1 <- data.frame(reportDate = x$REPORT_PERIOD, 
          net_assets_f = x$`TOT_ASSETS-TOT_LIAB`/1E4, 
          monetary_cap_f = x$MONETARY_CAP/1E4, 
          net_cash_f = (x$MONETARY_CAP - x$ST_BORROW)/1E4) 
p1 <- pointLinePlot(data_1.1.1) 
@ 


\begin{figure} 
    \centering 
<<fig = TRUE, echo = FALSE>>= 
print(p1) 
@ 
\caption{Here goes the caption.} 
\label{fig:p1} 
\end{figure} 


\begin{figure} 
    \centering 
<<fig = TRUE, echo = FALSE>>= 
print(grid.table(data_1.1.1, rows = NULL)) 
@ 
\caption{Here goes the caption.} 
\label{fig:p1} 
\end{figure} 


\end{document} 

Gibt es eine Möglichkeit das passieren eine Eingabe von einem Shin y App direkt auf RMD wie ich in input.Rnw mit SWeave (Stockcode < - Eingabe $ Stockcode) habe?

Antwort

0

Sie müssen es nicht an die Rmd-Datei übergeben. Wenn das Rmd gerendert wird, wird die Variable input$stockcode aus der aktuellen Umgebung übernommen, genau wie bei der Rnw-Version.

server.R

library(knitr) 
library(rmarkdown) 
shinyServer(function(input, output) { 

    output$report = downloadHandler(
    filename = 'myreport.pdf', 
    content = function(file) { 
     out = render('outout.Rmd') 
     file.rename(out, file) # move pdf to file for downloading 
    }, 
    contentType = NA 
) 
}) 

input.Rmd

--- 
title: "Output" 
output: pdf_document 
--- 

# Test 

```{r} 
print(input$stockcode) 
``` 

enter image description here