2013-10-19 46 views
9

我仍然對r和閃亮的新手感興趣,而且我很難理解本來應該是簡單邏輯的東西。我正在嘗試在imageOutput窗口小部件中顯示pdf文件,但沒有運氣。有人能把我引向正確的方向嗎?顯示來自本地驅動器的pdf格式的pdf格式

樣品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") 
)) 

樣品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)}) 

}) 

大部分的錯誤,我得到的與預期的特徵向量參數,或原子向量做。我知道,閃亮或多或少的設計來呈現圖像或情節,但必須有一種方法來顯示本地驅動器上的pdf。

+0

可能不相關,但你可以用'/'的路徑,而不是\\甚至在Windows – beroe

+0

我認爲這是目前沒有現成的組件。但是,當然你可以在網頁上顯示PDF。如果它可以在網狀空間中完成,那麼閃亮就可以適應它。請參閱https://github.com/mozilla/pdf.js – xiaodai

回答

15

要嵌入PDF查看器(默認PDF查看器你的網頁瀏覽器,例如mozilla上的pdf.js)在你的Shiny UI中,你可以使用一個iframe,其中src將成爲你的PDF的路徑。

這裏是2點型動物的方式,包括你的界面的iframe:

在用戶界面,您可以直接與絕對src屬性爲波紋管添加iframe標籤:

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

或者得到一個URL從服務器的用戶界面,編寫iframe標籤與輸入URL,並在htmlOutput在UI返回的HTML代碼:

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

服務器:

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

注意,當頁面加載了HTTP(S)協議(閃亮的應用程序的情況下),因爲你不能陷害他們的「文件當地人文件安全方面的原因: 「網址。如果您想顯示當地人pdf,您應該使用http(s): URL訪問它們,因此您必須將它們保存在您的www目錄(本地Web服務器)中,並使用它們的http(s): URL訪問文件(該URL將類似於http://localhost/.../mypdf.pdf)就像我例子中的第二個iframe一樣。 (那你不能直接使用的FileInput,你必須將其格式化)

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 = "")) 
    }) 

}) 

的網頁與PDF查看器:

enter image description here

希望這有助於。

+1

僅供參考:根據我使用此方法的經驗,您需要在瀏覽器中打開Shiny應用程序才能看到PDF。它不顯示在RStudio窗口中。 – moman822

0

在包含server.R和ui.R腳本的原始目錄中創建一個名爲www的文件夾。放置在WWW /文件夾中的PDF,然後使用類似下面的代碼:

在server.R:

shinyServer(function(input, output) { 

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

在UI。R:

shinyUI(fluidPage(

    titlePanel("Display a PDF"), 

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

    mainPanel(
     uiOutput("pdfview") 
    ) 
) 
))