web-dev-qa-db-ja.com

光沢のあるローカルドライブからのPDFを表示する

私はまだ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")
))

サンプル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を表示する方法が必要です。

20
Jeramy

シャイニーUIにPDFビューア(デフォルトのPDF Webブラウザのビューア、たとえばmozillaのpdf.js))を埋め込むには、 srcがPDFへのパスとなるiframe。

インターフェイスにiframeを含める2つの異なる方法を次に示します。

uiでは、次のように絶対src属性を持つiframeタグを直接追加できます。

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

または、サーバーのUIからURLを取得し、入力URLを使用してiframeタグを記述し、UIのhtmlOutputで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)プロトコル(Shinyアプリの場合)が読み込まれると、ローカルファイルを「file:」URLでフレーム化できないことに注意してください。ローカルPDFを表示する場合は、http(s): URLでアクセスする必要があるため、wwwディレクトリ(ローカルWebサーバー)に保存し、http(s):でファイルにアクセスする必要があります。私の例の2番目のiframeのように、URL(URLはhttp://localhost/.../mypdf.pdfのようなものになります)。 (その後、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閲覧者がいるWebページ:

enter image description here

この助けを願っています。

22
Julien Navarre

Fabian N.'s 回答に追加。

2つの重要なことがあります:

  1. RstudioからRShinyWebアプリケーションを作成してください。必ず「アプリの実行」として実行してください。そうしないと、「www」フォルダ内のファイルにアクセスできません。

enter image description here

  1. Webアプリケーションディレクトリに「www」フォルダを作成してください。
1
qingyang liu

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