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

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

образец 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")
))

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


person Jeramy    schedule 19.10.2013    source источник
comment
может быть не связано, но вы можете использовать / для путей вместо \\ даже в окнах   -  person beroe    schedule 19.10.2013
comment
Я думаю, что готового компонента на данный момент нет. Но, конечно, вы можете отображать PDF на веб-странице. Если это можно сделать в webapge, то иshiny можно приспособить для этого. См. github.com/mozilla/pdf.js.   -  person xiaodai    schedule 20.10.2013


Ответы (3)


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

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

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

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

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

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

Сервер.R:

shinyServer(function(input, output, session) {

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

})

Веб-страницы со средствами просмотра PDF:

введите здесь описание изображения

Надеюсь, это поможет.

person Julien Navarre    schedule 09.01.2014
comment
К вашему сведению: по моему опыту использования этого метода вам нужно открыть приложение Shiny в браузере, чтобы увидеть PDF-файл. Он не отображается в окне RStudio. - person moman822; 02.05.2017
comment
Можно ли как-то обезопасить папку www? или для предварительного просмотра PDF-файлов без использования www Я хочу иметь возможность предварительного просмотра изображений/pdf-файлов способом iframe, не создавая незащищенную URL-ссылку, к которой потенциально может получить доступ любой - person road_to_quantdom; 24.06.2019

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

На сервере.R:

shinyServer(function(input, output) {

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

In ui.R:

shinyUI(fluidPage(

  titlePanel("Display a PDF"),

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

    mainPanel(
      uiOutput("pdfview")
    )
  )
))
person Kris    schedule 09.08.2017
comment
Простой ответ, который работает, +1! Один комментарий: если файл статичен (не изменяется в зависимости от ввода пользователя), вы можете добавить tags$iframe() непосредственно в часть пользовательского интерфейса, нет необходимости использовать renderUI() и uiOutput(). - person Antoine; 21.06.2021

Дополнение к ответу Fabian N..

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

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

введите здесь описание изображения

  1. Убедитесь, что вы создали папку «www» в каталоге веб-приложения.
person qingyang liu    schedule 05.03.2019
comment
Вы также можете запустить его из командной строки, например, runApp('maintask',host = "0.0.0.0"), если вы хотите, чтобы он был виден извне. И я считаю, что любое приложение R Shiny является веб-приложением R Shiny. - person Josiah Yoder; 14.06.2019