在Shiny app

时间:2016-03-04 16:17:18

标签: r pdf shiny r-markdown

我创建了一个非常大的闪亮应用程序,其中包含可下载的pdf报告。客户已在pdf的每个页面的标题中请求了他们的徽标。当pdf本身(不是更大的闪亮应用程序的一部分)时,我可以在pdf上获得徽标,但当我尝试从闪亮的应用程序中下载完全相同的报告时,pandoc无法找到图像。下面是一个最小的工作示例和我尝试过但未能开始工作的事项列表。 smiley.png位于app.R文件夹中,可以替换为任何图片。 smiley.png与我在完整应用中使用的图片不同,因此与图片无关。原始图片。

编织rmarkdown本身效果很好并且包含标题。试图从闪亮的应用程序中下载导致问题 我试过了:

  • 将图像移动到名为" images"的文件夹中。并引用images \ smiley.png而不是smiley.png。这也失败了同样的错误。
  • 当应用程序上传到shinyapps.io时,
  • 引用/srv/shiny-server/AppName/smiley.png。无法找到图像失败(相同类型的错误)。
  • 使用普通![Logo](smiley.png)语法而不是四个标题行。也失败了同样的错误,无法找到smiley.png
  • 在我的www文件夹中使用smiley.png的
  • <img src="smiley.png" />不起作用。我正在编织pdf,而不是html。 pdf针织但不包括图像。它只是删除了HTML。
  • 在我的www文件夹中使用带有smiley.png的普通![Logo](smiley.png)语法不起作用。同样的错误;找不到smiley.png。

我最好的猜测是,当应用程序运行时,它会以某种方式在目录中移动,而.rmd无法找到图像。那么我需要参考什么才能找到图像?我可以把它放在特定的文件夹中吗?我尝试了很多不同的事情并做了大量的研究,但却找不到一个类似的例子。我在闪亮的应用程序中使用了我用于图像的www文件夹(下面没有包含),添加新文件夹,将图像放在与.rmd相同的文件夹中...它已经很长了研究,试验和错误的过程没有成功。

该应用:

library(shiny)
ui<-shinyUI(fluidPage(
  titlePanel("Hello Shiny!"),
  sidebarPanel(
    downloadButton('downloadReport',label="Download Report")
              ),
  mainPanel(
      p("Hello")
           )
  ))

server<-shinyServer(function(input, output) {
   output$downloadReport <- downloadHandler(
      filename = function() {
           paste0('Report_.pdf')
                            },
      content = function(file) {
           src <- normalizePath('report.rmd')
           owd <- setwd(tempdir())
           on.exit(setwd(owd))
           file.copy(src, 'report.rmd')
           library(rmarkdown)
           out <- render('report.rmd',pdf_document())
           file.rename(out, file)
                               }
   )
 })

shinyApp(ui, server)#Runs the app

R降价报告.rmd:

---
title: "Test"
date: "Friday, March 04, 2016"
output: pdf_document
header-includes: \usepackage{fancyhdr}
---

\addtolength{\headheight}{1.0cm}
\pagestyle{fancyplain}
\lhead{\includegraphics[height=1.2cm]{smiley.png}}
\renewcommand{\headrulewidth}{0pt}

```{r, echo=FALSE}
plot(cars)
```
```{r, echo=FALSE}
plot(cars)
```

错误:

  C:/Apps/RStudio/bin/pandoc/pandoc report.utf8.md --to latex --from markdown+autolink_bare_uris+ascii_identifiers+tex_math_single_backslash-implicit_figures --output report.pdf --template C:\Apps\R-3.1.1\library\rmarkdown\rmd\latex\default.tex --highlight-style tango --latex-engine pdflatex --variable geometry:margin=1in  
 pandoc.exe: Error producing PDF from TeX source.  
 ! Package pdftex.def Error: File `smiley.png' not found.  

 See the pdftex.def package documentation for explanation.  
 Type  H <return>  for immediate help.  
 ...                                              

l.88 \end{document}  

Warning: running command 'C:/Apps/RStudio/bin/pandoc/pandoc report.utf8.md --to latex --from  markdown+autolink_bare_uris+ascii_identifiers+tex_math_single_backslash-implicit_figures --output report.pdf --template C:\Apps\R-3.1.1\library\rmarkdown\rmd\latex\default.tex --highlight-style tango --latex-engine pdflatex --variable geometry:margin=1in' had status 43  
Error : pandoc document conversion failed with error 43  
In addition: Warning message:  
package ‘shiny’ was built under R version 3.1.3   
Warning: Error in : pandoc document conversion failed with error 43  
Stack trace (innermost first):  
   55: pandoc_convert  
   54: render  
   53: download$func [C:/Data/Documents/Technomic/Testing images/app.R#25]  
    5: <Anonymous>  
    4: do.call  
    3: print.shiny.appobj  
    2: print  
    1: source  

谢谢!我希望有人有一些想法。我几天都在研究和尝试各种事情。

编辑:修正了输出格式。

1 个答案:

答案 0 :(得分:7)

终于找到了问题 - 它根本没有在rmarkdown中。我正在将report.pdf复制到一个临时目录,以确保我可以写入它,这意味着报告无法再找到该图像。我所要做的就是将图像复制到临时目录中。添加了两个新行,它现在完美无缺!

希望这会帮助别人!我知道我花了很长时间寻找这个解决方案,并且无法找到其他人试图将图像包含在可下载的报告中。

library(shiny)

# Define UI for application that draws a histogram
ui<-shinyUI(fluidPage(
  titlePanel("Hello Shiny!"),
    sidebarPanel(
      downloadButton('downloadReport',label="Download Report")
    ),
    mainPanel(
      p("Hello")
    )
))

server<-shinyServer(function(input, output) {
  output$downloadReport <- downloadHandler(
    filename = function() {
      paste0('Report_.pdf')
    },
    content = function(file) {
      src <- normalizePath('report.rmd')
      src2 <- normalizePath('smiley.png') #NEW 
      owd <- setwd(tempdir())
      on.exit(setwd(owd))
      file.copy(src, 'report.rmd')
      file.copy(src2, 'smiley.png') #NEW
      library(rmarkdown)
      out <- render('report.rmd',pdf_document())
      file.rename(out, file)
    }
  )
})

shinyApp(ui, server)#Runs the app