2016-07-14 31 views
8

üzerinden knitr belgesine yükleme PDF belgeleri oluşturmak için Shiny ve knitr bileşimini kullanıyorum.Resmi parlak

Şu anda kullanıcının, oluşturulan belgeye yerleştirilecek resmi yüklemesine izin verecek bir özellik eklemek istiyorum. Ancak, gerçekten sıkışmış durumdayım çünkü giriş resminin yolunu alamıyorum. Birisi bana yardım edebilir mi?

Basit bir örnek:

Uygulama:

library(knitr) 
library(shiny) 

ui <- fluidPage(

    sidebarLayout(
    sidebarPanel(
     fileInput("picture", label = 'Picture'), 
     downloadButton('report', label = 'Download PDF') 
    ), 

    mainPanel() 
) 
) 

server <- function(input,output){ 

    picture <- reactive({ 
    input$picture[,4] 
    }) 

    output$report = downloadHandler(
    filename = "test.pdf", 

    content = function(file){ 
     picture = picture() 

    out = knit2pdf(input = 'test.Rnw', compiler = 'xelatex', clean = TRUE) 
    file.rename(out, file) 
    }, 

    contentType = 'application/pdf' 
) 
} 

shinyApp(ui = ui, server = server) 

ve .Rnw belge: Ben sadece geçici resim yolunu bilmiyorum çünkü '\includegraphics[height=3in]{', picture,'} açıkçası, soruna neden olan

\documentclass{article} 

\begin{document} 

Put picture here: 
<<echo = FALSE , message = F, results='asis'>>= 
cat(paste('\\includegraphics[height=3in]{', picture,'}')) 
@ 

\end{document} 

Bölüm bir.

1) seçtiğiniz bir klasöre geçici dosya kopyalama ve bu görüntüyü kullanmak: Eğer (bu durumda R ise

observe({ 
     if (is.null(input$picture)) return() 
     picture<-"your/final/path/to/disk/uploadImage.jpg" # OR do a PASTE with the PATH and the upload file name 
     file.copy(input$picture$datapath, picture) 
     if(file.exists(picture)){ 
      # PROCESS THE IMAGE IF NEEDED 
     } 
     picture<<-picture # sometimes needed to R to see the variable outside the observe scope 
}) 

2)

+1

yüklenen dosya yolu girişi $ resim datapath' –

+0

Evet, $ ama geçici dizinin yolunu mi ve nasıl çalışır hale getirmek için hiçbir fikrim yok 'dır. Dahası, $ datapath kodumdaki [, 4] ile aynı. –

+0

'.Rnw' dosyanızda' paste 'ile 'paste' değiştirmeyi deneyin, aksi takdirde dosya adından sonra resim boşluk kalır ve resim bulunmaz. – NicE

cevap

2

Sen o zaman tam yolu ile tamam olmalıdır Parlak Server ile çalışma olduğunu söyledi Resim, geçici bir dizinde olsa bile (şu anda Shiny Server yalnızca Linux üzerinde çalışır ve LaTeX, /tmp/...../yourfile.png gibi Linux dosya yollarıyla tamamlanmalıdır). Sorun, belki de datapath (yani, input$picture[, 4]) dosya uzantısına sahip değil, bu nedenle LaTeX onu tanıyamadı. Orijinal dosyanın dosya adı uzantısını almaya çalışabilir ve yüklenen resmi aynı uzantıya sahip bir geçici dosyaya kopyalayabilirsiniz.

picture <- reactive({ 
    path1 <- input$picture$datapath 
    path2 <- tempfile(fileext = gsub('^(.*)([.].+)$', '\\2', input$picture$name)) 
    file.copy(path1, path2, overwrite = TRUE) 
    path2 
}) 
+0

Cevabınız için çok teşekkür ederim ama hala 'run' texi2dvi 'on' test.tex 'hatasını çalıştırıyorum. LaTeX hataları: ! LaTeX Hata: Dosya '/ tmp/RtmpoSS6qz/4683e6ec5bcf520337300eb1/0' bulunamadı. 'Muhtemelen çok temel bir şey eksik ama gerçekten bunu çözemiyorum. –

+0

Ayrıca, ben reaktif fonksiyonunu atadım resim() '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ile cture() ' –

+0

Anladım. Üzgünüm kaçırdım. Cevabı bir dakika içinde günceller. –

1

i iki şekilde çözüm bakın diske yazma iznine izin verilmez, görüntüyü bir base64 değişkenine dönüştürebilir ve bunu Knitr belgenize dahil edebilirsiniz (veya bir veri tabanına bir dize olarak kaydedebilirsiniz). Bu dolambaçlı yoldan gitmek istiyorsanız, Knitr/HTML yolunu alır. (Bir sunucudan çalışan R Studio, hemen hemen her zaman bir ADMIN olarak işleyebileceğiniz okuma/yazma konusunda çok fazla kısıtlamaya sahiptir. Ve sunucu, RTV olarak parlak oturumu çalıştırır ve siz Rstudio'nun okuma/yazma izinlerine sahip olması gerekir. Eğer otomatik bir Rstudio Parlak oturum olarak Parlak uygulamanın çalışma ve doğrudan RStudio kullanarak rUN)

< < 'kullanarak base64 yine 'gözlemlemek' veya 'eğer' kapsamında ouside R tarafından okunabilir olduğundan emin olun formu çalışmıyor - '< -' ile birlikte. Kapsam belirleme, R ile özel bir şeydir, bu yüzden doğru bir şekilde test ettiğinizden emin olun. sitelerle

Bunu (base64) dalmak gerekir mi:

https://github.com/yihui/knitr/issues/944

https://github.com/yihui/knitr/blob/master/R/utils-base64.R

+0

Yanıt için çok teşekkür ederim. Uygulama üzerinde çalışacağım ve yaklaşımınızın sorunu çözmeme izin verip vermediğini size bildireceğim. İşaret ettiğin gibi, aslında Shiny sunucusuyla çalışıyorum, bu yüzden yazma izinleriyle ilgili sorunlar var. İşte bu yüzden [burada] (http://stackoverflow.com/questions/35800883/using-image-in-r-markdown-report-downloaded-from-shiny-app) verilen çözümü kullanıyordum, ancak önceden tanımlanmış bazı görüntüler için sunucuya yerleştirilir. Resim kullanıcı tarafından yüklendiğinde bu duruma uygulanıp uygulanamayacağını merak ediyordum? –

+0

@An ekonomist, Her zaman komple sistem yolları ile çalışırım (C:/.... veya/.../... veya .. ile ROOT'tan başlayarak sisteme bağlı olarak çalışır. Aynı ya da yakındaki klasör.İşleyebilir ancak bazı R programcıları çalışma dizinlerini değiştirmeyi severler (setwd() ve getwd() --- >>> bana değil = ^) ve sonra körlerdesiniz. Bu arada, her zaman temp dosya dizini işlev çağrısı ile alabilirsiniz: tempdir() – irJvV