私はまだ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を表示する方法が必要です。
シャイニー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ページ:
この助けを願っています。
Fabian N.'s 回答に追加。
2つの重要なことがあります:
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")
)
)
))