2013-10-19 15 views
9

Sono ancora nuovo di r e lucido, e sono perplesso con quello che dovrebbe essere altrimenti semplice logica. Sto cercando di visualizzare i file pdf nei widget imageOutput ma senza fortuna. Qualcuno potrebbe guidarmi nella giusta direzione?visualizzazione di un pdf da un'unità locale in splendente

campione ui.R

shinyUI(pageWithSidebar(
mainPanel(
    selectInput("sel_ed", 
       label = "View outputs for Ecodistrict:", 
       choices = c(244,245,247,249), 
       selected = NULL, 
       multiple = FALSE), 

    imageOutput("imp_pdf",width="500px",height="500px") 
)) 

campione server.R

shinyServer(function(input, output, session) { 

importance <- function(inputSpecies){ 
img_dir <- pdf(paste(inputSpecies,"\\models\\MATL\\MATRF_Importance",sep="")) 
} 

output$imp_pdf <- renderImage({importance(input$sel_ed)}) 

}) 

maggior parte degli errori che ottengo avere a che fare con argomenti attesi carattere vettoriale, o vettori atomiche. So che il lucido è più o meno progettato per rendere E visualizzare immagini o grafici ma ci deve essere un modo per visualizzare i pdf che sono già su un'unità locale ..

+0

non possono essere correlati, ma si può usare '/' per i percorsi invece di \\ anche in finestre – beroe

+0

penso che ci sia alcuna componente già pronto al momento. Ma ovviamente puoi visualizzare il pdf in una pagina web. Se può essere fatto in un webapge, allora può essere adattato per farlo. Vedere https://github.com/mozilla/pdf.js – xiaodai

risposta

15

Per incorporare un visualizzatore PDF (il visualizzatore PDF predefinito di il tuo browser web, pdf.js su mozilla per esempio) nel tuo interfaccia utente Shiny, puoi usare un iframe che lo src sarà il percorso del tuo PDF.

Ecco 2 differenti modi per includere un iframe nella vostra interfaccia:

nell'interfaccia utente è possibile aggiungere direttamente un tag iframe con un attributo src assoluto come muggito:

tags$iframe(style="height:600px; width:100%", src="http://localhost/ressources/pdf/R-Intro.pdf")) 

o ottenere un URL dall'interfaccia utente nel server, scrivere il tag iframe con l'URL di input e restituire il codice HTML in un htmlOutput nell'interfaccia utente:

Ui:
textInput("pdfurl", "PDF URL")
htmlOutput('pdfviewer')

Server:

output$pdfviewer <- renderText({ 
    return(paste('<iframe style="height:600px; width:100%" src="', input$pdfurl, '"></iframe>', sep = "")) 
}) 

Si noti che quando le pagine vengono caricate con una (S) protocollo HTTP (il caso delle app lucido) per motivi di sicurezza non è possibile incorniciate file locali con il loro "file: "URL. Se vuoi visualizzare il pdf locale dovresti accedervi con un URL http(s):, quindi devi salvarli nella tua directory www (un server web locale) e accedere ai file con i loro URL http(s): (l'URL sarà qualcosa come http://localhost/.../mypdf.pdf) come nel secondo iframe del mio esempio. (Allora non è possibile utilizzare un FileInput direttamente, bisogna formattarla)

Ui.R:

library(shiny) 

row <- function(...) { 
    tags$div(class="row", ...) 
} 

col <- function(width, ...) { 
    tags$div(class=paste0("span", width), ...) 
} 

shinyUI(bootstrapPage(

    headerPanel("PDF VIEWER"), 

    mainPanel(

    tags$div(
     class = "container", 

     row(
     col(3, textInput("pdfurl", "PDF URL")) 
    ), 
     row(
     col(6, htmlOutput('pdfviewer')), 
     col(6, tags$iframe(style="height:600px; width:100%", src="http://localhost/ressources/pdf/R-Intro.pdf")) 
    ) 
    ) 
) 
)) 

Server.R:

shinyServer(function(input, output, session) { 

    output$pdfviewer <- renderText({ 
     return(paste('<iframe style="height:600px; width:100%" src="', input$pdfurl, '"></iframe>', sep = "")) 
    }) 

}) 

Le pagine web con i visualizzatori PDF :

enter image description here

Spero che questo aiuto.

+1

Una nota: nella mia esperienza con questo metodo, è necessario aprire l'app Shiny in un browser per vedere effettivamente il PDF. Non viene visualizzato nella finestra RStudio. – moman822

0

Creare una cartella denominata www nella directory originale contenente gli script server.R e ui.R. Posizionare il PDF in www/cartella, quindi usare qualcosa come il codice qui sotto:

In server.R:

shinyServer(function(input, output) { 

    observeEvent(input$generate, { 
    output$pdfview <- renderUI({ 
     tags$iframe(style="height:600px; width:100%", src="foo.pdf") 
    }) 
    }) 
}) 

nell'interfaccia utente.R:

shinyUI(fluidPage(

    titlePanel("Display a PDF"), 

    sidebarLayout(
    sidebarPanel(
     actionButton("generate", "Generate PDF") 
    ), 

    mainPanel(
     uiOutput("pdfview") 
    ) 
) 
)) 
Problemi correlati