Отображение pdf с локального диска в блестящем

Я по-прежнему новичок в r и блестящий, и я озадачен тем, что должно быть простой логикой. Я пытаюсь отобразить pdf файлы в виджетах imageOutput, но не повезло. Может ли кто-нибудь направить меня в правильном направлении?

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

sample 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, которые уже находятся на локальном диске.

Ответ 1

Чтобы внедрить средство просмотра PDF (средство просмотра PDF по умолчанию вашего веб-браузера, например pdf.js на mozilla) в вашем Shiny ui, вы можете использовать iframe, который src станет путем вашего PDF файла.

Вот два разных способа включить iframe в ваш интерфейс:

в Ui вы можете напрямую добавить тег iframe с абсолютным атрибутом src, как показано ниже:

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

Или получите URL-адрес от ui на сервере, напишите тег iframe с URL-адресом ввода и верните HTML-код в htmlOutput в файле ui:

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) (случай приложения Shiny) по соображениям безопасности, вы не можете создавать файлы локалей с их URL-адресами "file:". Если вы хотите отображать локальные pdf файлы, вы должны получить к ним доступ с URL-адресом http(s):, поэтому вам нужно сохранить их в своем www-каталоге (локальном веб-сервере) и получить доступ к файлам с их URL-адресами http(s): (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

Надеюсь на эту помощь.

Ответ 2

Создайте папку с именем www в исходной директории, содержащей ваши скрипты server.R и ui.R. Поместите PDF в папку www/, затем используйте что-то вроде кода ниже:

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

Ответ 3

Дополнительно к ответу Фабиана Н.

Есть две важные вещи:

  1. Убедитесь, что вы создали R Shiny Web Application от Rstudio. Убедитесь, что вы запускаете как "Запустить приложение". В противном случае файлы в папке "www" не будут доступны!

enter image description here

  1. Убедитесь, что вы создали папку "www" в каталоге веб-приложений.