26

我对 r 和闪亮仍然很陌生,而且我对原本应该是简单逻辑的东西感到困惑。我正在尝试在 imageOutput 小部件中显示 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")
))

示例服务器.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。

4

3 回答 3

32

要在 Shiny ui 中嵌入 PDF 查看器(Web 浏览器的默认 PDF 查看器,例如 mozilla 上的 pdf.js),您可以使用 iframe,其中 src 将作为 PDF 的路径。

这是在界面中包含 iframe 的 2 种不同方法:

在 Ui 中,您可以直接添加iframe具有绝对 src 属性的标签,如下所示:

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

或者从服务器的 ui 中获取 URL,iframe使用输入 URL 编写标签,并在 ui 中的 htmlOutput 中返回 HTML 代码:

界面:
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 框住本地文件。如果您想显示本地 pdf,您应该使用http(s):URL 访问它们,因此您必须将它们保存在 www 目录(本地 Web 服务器)中并使用它们的 URL 访问文件http(s):(URL 类似于http://localhost/.../mypdf.pdf),如我的示例的第二个 iframe。(那你不能直接使用fileInput,必须格式化)

用户界面:

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 查看器的网页:

在此处输入图像描述

希望这有帮助。

于 2014-01-09T15:55:15.987 回答
7

在包含 server.R 和 ui.R 脚本的原始目录中创建一个名为 www 的文件夹。将 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")
    )
  )
))
于 2017-08-09T21:28:43.430 回答
3

除了Fabian N. 的回答。

有两个重要的事情:

  1. 确保从 Rstudio 创建一个 R Shiny Web 应用程序。确保以“运行应用程序”运行。否则无法访问“www”文件夹中的文件!

在此处输入图像描述

  1. 确保在 Web 应用程序目录中创建一个“www”文件夹。
于 2019-03-05T18:34:46.060 回答