2016-12-05 9 views
0

Also ich versuche, ein HTML-R-Abschrift-Dokument mit interaktiven glänzenden Bits, die den Benutzer ein Diagramm bearbeiten und laden Sie dann die Ergebnisse in ein PDF zu schreiben. Es ist jedoch etwas katastrophal falsch mit der Art, wie ich das versuche, denn sobald der HTML-Code beginnt, überschreibt er die originale Markdown-Datei mit dem Inhalt der PDF-Datei - und verwandelt sie im Editor in vollständiges Kauderwelsch.Shiny interaktive Dokument-Download-Taste überschreibt Original-R-Abschrift

Ich bezweifle, dass ich eine völlig neue Möglichkeit gefunden habe, bei R zu scheitern, aber ich konnte nicht finden, wo sonst jemand dieses Problem hatte. Außerdem habe ich mir das glänzende Referenzmaterial angeschaut und gehe jetzt einfach im Kreis, sodass jede Hilfe sehr geschätzt wird.

Ich benutze Rstudio 1.0.44, Rmarkdown 1.2 und glänzend 0.14.2. Eine kleine (nicht) Arbeitsbeispiel:

--- 
title: "Minimum Failing Example" 
author: "wittyalias" 
date: "December 5, 2016" 
output: html_document 
runtime: shiny 
--- 

```{r echo = FALSE} 
library(ggplot2) 

today <- Sys.Date() 

inputPanel(downloadButton("dnld", label = "Download pdf")) 

renderPlot({ 
    # Example code from http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2)/ 
    p1 <<- ggplot(ChickWeight, aes(x=Time, y=weight, colour=Diet, group=Chick)) + 
    geom_line() + 
    ggtitle("Growth curve for individual chicks") 
    p1 
}) 

reactive({ 
    fname <- paste0("Chick Weight - ", today, ".pdf") 

    output$dnld <- downloadHandler(filename = fname, 
        content = makethepdf(file)) 

    makethepdf <- function(fname) { 
     pdf(fname, 
      width = 14, 
      height = 8.5) 
     p1 
     dev.off() 
} 
}) 
``` 

EDIT: Um klar zu sein: Ich möchte der Benutzer mehrere Seiten von Grafiken zum Download in der Lage sein, von denen einige unterschiedliche Formatierungen haben. Der Benutzer wird nicht nur eine PDF-Version des Abschriften-Dokuments herunterladen.

Antwort

0

In Ordnung, so gibt es eine Reihe von Problemen mit meinem Code, aber mit einigen der Vorschläge in den anderen Antworten konnte ich es ausarbeiten.

Das primäre Problem mit diesem kleinen Dokument ist, dass content im downloadHandler ist eine Funktion, aber in meinem Code setzte ich content gleich das Ergebnis eines Funktionsaufruf. Es sieht so aus, als wenn die glänzende App zum ersten Mal ausgeführt wird, kompiliert sie content und denkt, dass es eine Funktion ist, aber am Ende ruft sie die Funktion auf. Es sendet file als ein Argument, das nicht als eine Basisfunktion zu existieren scheint. Rufen makethepdf mit nur file wirft einen Fehler, wenn ich es in der Konsole verwenden, aber aus welchem ​​Grund auch immer in dieser App geht es einfach mit dem Anruf, offenbar mit file = [name of the .Rmd] (wie OganM sagte).

output$dnld <- downloadHandler(filename = fname, 
       content = makethepdf(file)) 

zu

output$dnld <- downloadHandler(filename = fname, 
       content = makethepdf) 

Um klar zu sein:

zu beheben, dies ändern dieser Code die nicht überschrieben werden.Rmd-Datei, wenn contentmakethepdf mit einem anderen Argument als file aufruft. Zum Beispiel content = makethepdf(fnm)) bewirkt, dass der Download-Button einen object not found Fehler anzuzeigen und content = makethepdf(fname)) bewirkt, dass die Download-Schaltfläche, um einen attempt to apply non-function Fehler werfen, wenn sie gedrückt.

0

Das passiert, weil Gründe, die ich nicht identifizieren konnte, makethepdf mit dem file = [name of the file] läuft. Fügen Sie eine print(fname) ein, um zu sehen. Der Download-Handler sollte sich jedoch nicht in einem Beobachter befinden. Du musst es draußen alleine haben. Ich habe es auch nicht geschafft pdf()dev.off() Kombination aus irgendeinem Grund zu machen, also hier ist eine funktionierende Version unten.

output$dnld = downloadHandler(filename = paste0("Chick Weight - ", today, ".pdf"), 
          content = function(file){ 
           ggsave(file, plot = p1, width = 14, height = 8.5) 
          }) 
+0

Vielen Dank für diesen Vorschlag sehr, aber ich brauche, um mehrere Seiten im pdf, und soweit ich weiß, ggsave mich nicht erlauben, machen wird, das zu tun. Außerdem habe ich 'print (fname)' sowohl außerhalb als auch innerhalb der Makethepdf-Funktion eingefügt, und es gibt das "Chick Weight .... pdf" zurück, das ich erwartet hätte. – wittyalias

0

Verwenden tempfile() und tempdir() eine temporäre Datei zu erstellen:

output$downloadReport = downloadHandler(

    filename = function() { 
     normalizePath(tempfile("report_", fileext = ".docx"), winslash = "/") 
    }, 

    content = function(file) { 

    out = rmarkdown::render("./report.Rmd", 
          output_file = file, 
          output_dir = tempdir(), 
          output_format = "pdf_document", 
          intermediates_dir = tempdir(), 
          envir = new.env(), 
          params = list(fontSize = 10) 
) 
}) 

ich in der Regel eine separate .Rmd Vorlage für meine heruntergeladenen Berichte wie das Layout und Text sind in der Regel ähnlich verwenden, aber nicht identisch, was funktioniert in einer App.

Ich finde auch die Verwendung von Parametern ist eine bequeme Möglichkeit, Eingabeeinstellungen von meiner App zu meinem Bericht zu übergeben. Siehe this RStudio post für Details

+0

Das ist eine gute Idee, mir war nicht bewusst, dass das gemacht werden könnte. Ich werde es morgen benutzen, aber ich bin mir nicht sicher, ob es funktionieren wird. Ich möchte nur die Grafik (en) und nicht den vollständigen Abschriftenbericht einbeziehen. Ist das möglich? – wittyalias