Загрузка отчета в приложении Shiny не удалась

В моем приложении Shiny пользователь может создать настраиваемый отчет — ладно, это и есть цель…

А сейчас пользователь должен выбрать все элементы (Аннотация, Гистограмма, Дополнительные комментарии), чтобы все было просто. Все, что есть во входных виджетах, затем передается в создание отчета (см. downloadhandler() в приложении.R).

Отчет может быть в формате html или pdf. И оба варианта терпят неудачу на разных стадиях.

Но теперь давайте посмотрим на код и для пояснения: Вы можете скопировать код и запустить его. Единственное, что придется изменить, это html или pdf в обоих файлах (app.R и report.Rmd, см. комментарии).

приложение.R

# the packages I'm using (hopefully a complete list)
#library(pandoc)
#library(tinytex)
#library(bookdown)
#library(markdown)
#library(rmarkdown)
#library(knitr)
#pandoc_activate()

ui <- fluidPage(
    fluidRow(
        # Inputarea
        # Choose which elements should be added to the Report
        column(5,
            br(),
            checkboxGroupInput(
                inputId = "show_elements",
                label = "Choose elements to be in report",
                choices = c("Abstract","Histogram","Additional Comments"),
                selected = c("Abstract","Histogram","Additional Comments")
                #inline = FALSE,
                #width = NULL,
                #choiceNames = NULL,
                #choiceValues = NULL
            ),
            br(),
            br(),
            hr(),
            br(),
            # if Abstract is checked, then it is shown in the UI
            conditionalPanel(
                condition = "input.show_elements.includes('Abstract')",
                textAreaInput(inputId = "caption", label=NULL, value  = "Abstract data", width = "1000px", height = "100px")
            ),
            br(),
            # if Histogram is checked, then it is shown in the UI
            conditionalPanel(
                condition = "input.show_elements.includes('Histogram')",
            sliderInput(inputId = "bins",
                    label = "Number of bins:",
                    min = 1,
                    max = 50,
                    value = 30)
            ),
            # if Additional Comments is checked, then it is shown in the UI
            conditionalPanel(
                condition = "input.show_elements.includes('Additional Comments')",
                textAreaInput(inputId = "caption_1", label=NULL, value  = "further notes for the report", width = "1000px", height = "100px")
            )
        ),
        # Outputarea
        column(7,
            br(),
            # if Abstract is checked, then it is shown in the UI
            conditionalPanel(
                condition = "input.show_elements.includes('Abstract')",
                verbatimTextOutput("abstract")
            ),
            br(),
            # if Histogram is checked, then it is shown in the UI
            conditionalPanel(
                condition = "input.show_elements.includes('Histogram')",
                plotOutput(outputId = "distPlot")
            ),
            br(),
            # if Additional Comments is checked, then it is shown in the UI
            conditionalPanel(
                condition = "input.show_elements.includes('Additional Comments')",
                verbatimTextOutput("add_com")
            ),
            br(),
            # The download button 
            downloadButton("reportGeneration", "Download Report")
        )
    )
)

server <- function(input, output) {
    # Output corresponding to "Abstract"
    output$abstract <- renderText({ input$caption })

    # Output corresponding to "Histogram"
    output$distPlot <- renderPlot({

        x    <- faithful$waiting
        bins <- seq(min(x), max(x), length.out = input$bins + 1)

        hist(x, breaks = bins, col = "#007bc2", border = "white",
           xlab = "Waiting time to next eruption (in mins)",
           main = "Histogram of waiting times")

    })

    # Output corresponding to "Additional Comments"
    output$add_com <- renderText({ input$caption_1 })



    # Download the document (html or pdf)
    output$reportGeneration <- downloadHandler(
        filename = "report.html",  # if necessary change to report.pdf (app.R and report.Rmd must have either html or pdf)
        content = function(file) {
            tempReport<-file.path("C:/Users/tueftla/R","report.Rmd")
            file.copy('report.Rmd', tempReport, overwrite = TRUE)
            params = list(text1=input$caption, value1=input$bins, text2=input$caption_1)
            rmarkdown::render(
                input =tempReport,
                output_file = file,
                params = params,
                envir = new.env(parent = globalenv())
            )
        
        }
    )

}

shinyApp(ui, server)

отчет.Rmd

<!-- YAML header with the three parameters -->
---
title: "My R Markdown Document"
author: "tueftla"
date: "`r format(Sys.time(), '%d.%m.%Y')`"
output: html_document <!-- Depending on the app.R it could be also pdf_document -->
params:
  text1: NA
  text2: NA
  value1: NA
---

```{r include=FALSE}
library(knitr)
```
 
## Abstract <!-- Here the first parameter text1 should be used -->
 
```{r, results='asis',echo=FALSE,warning=FALSE}
print(params[["text1"]])
```
 

## Histogram <!-- Here the third parameter value1 should be used -->
 
```{r results='asis',echo=FALSE,warning=FALSE}
x <- faithful$waiting
bins <- seq(min(x), max(x), length.out = params[["value1"]] + 1)

hist(x, breaks = bins, col = "#007bc2", border = "white",
     xlab = "Waiting time to next eruption (in mins)",
     main = "Histogram of waiting times")
```

## Additional Comments <!-- Here the second parameter text2 should be used -->

```{r, results='asis',echo=FALSE,warning=FALSE}
print(params[["text2"]])
```

Когда я запускаю приложение Shiny с помощью runApp() с выводом html (в обоих файлах), консоль выводит следующие строки:

Listening on http://127.0.0.1:3347
processing file: report.Rmd
output file: report.knit.md
"C:/Users/tueftla/AppData/Local/r-pandoc/r-pandoc/3.1.12.2/pandoc" +RTS -K512m -RTS report.knit.md --to html4 --from markdown+autolink_bare_uris+tex_math_single_backslash --output pandoc50a034b324e1.html --lua-filter "C:\Users\tueftla\AppData\Local\R\win-library\4.3\rmarkdown\rmarkdown\lua\pagebreak.lua" --lua-filter "C:\Users\tueftla\AppData\Local\R\win-library\4.3\rmarkdown\rmarkdown\lua\latex-div.lua" --embed-resources --standalone --variable bs3=TRUE --section-divs --template "C:\Users\tueftla\AppData\Local\R\win-library\4.3\rmarkdown\rmd\h\default.html" --no-highlight --variable highlightjs=1 --variable theme=bootstrap --mathjax --variable "mathjax-url=https://mathjax.rstudio.com/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML" --include-in-header "C:\Users\tueftla\AppData\Local\Temp\Rtmp04VMVZ\rmarkdown-str50a01a17b14.html"
Output created: C:\Users\tueftla\AppData\Local\Temp\Rtmp04VMVZ\file50a062984a73.html

Кажется, это как-то работает, потому что написано, что создано... но html-файла там нет. Папка Rtmp04VMVZ существует и в ней есть несколько файлов...

Вопрос 1: Где мой html-файл, который по данным консоли создан?! И можно ли его просто скачать или еще лучше указать папку куда сохранять хтлм?

А теперь давайте сделаем runApp() с выводом PDF (в обоих файлах) и посмотрим на вывод консоли:

Listening on http://127.0.0.1:3347
processing file: report.Rmd
output file: report.knit.md
"C:/Users/tueftla/AppData/Local/r-pandoc/r-pandoc/3.1.12.2/pandoc" +RTS -K512m -RTS report.knit.md --to latex --from markdown+autolink_bare_uris+tex_math_single_backslash --output pandoc50a0326f48e.tex --lua-filter "C:\Users\tueftla\AppData\Local\R\win-library\4.3\rmarkdown\rmarkdown\lua\pagebreak.lua" --lua-filter "C:\Users\tueftla\AppData\Local\R\win-library\4.3\rmarkdown\rmarkdown\lua\latex-div.lua" --embed-resources --standalone --highlight-style tango --pdf-engine pdflatex --variable graphics --variable "geometry:margin=1in"
Warning in system2(..., stdout = if (use_file_stdout()) f1 else FALSE, stderr = f2)
'"pdflatex"' not found
Warning: Error in : LaTeX failed to compile C:\Users\tueftla\AppData\Local\Temp\Rtmp04VMVZ\file50a026d52af1.tex. See https://yihui.org/tinytex/r/#debugging for debugging tips.
    1: runApp

Мне кажется, это не удалось из-за отсутствия pdflatex?! Подсказки по отладке ничего не изменили (с моей точки зрения)...

Вопрос 2: В чем проблема и как ее решить? И, как уже упоминалось в моем первом вопросе, можно ли просто скачать PDF-файл или, что еще лучше, указать папку, в которой следует сохранить PDF-файл?

Заранее большое спасибо за вашу помощь!

EDIT_1: Я немного изменил файл report.Rmd. В фрагментах кода я использую только значения params...

<!-- YAML header with the three parameters -->
    ---
    title: "My R Markdown Document"
    author: "tueftla"
    date: "`r format(Sys.time(), '%d.%m.%Y')`"
    output: html_document <!-- Depending on the app.R it could be also pdf_document -->
    params:
      text1: NA
      text2: NA
      value1: NA
    ---
    
    ```{r include=FALSE}
    library(knitr)
    ```
     
    ## Abstract <!-- Here the first parameter text1 should be used -->
     
    ```{r, results='asis',echo=FALSE,warning=FALSE}
    print("Abstract") #print(params[["text1"]])
    ```
     
    
    ## Histogram <!-- Here the third parameter value1 should be used -->
     
    ```{r results='asis',echo=FALSE,warning=FALSE}
    x <- faithful$waiting
    bins <- seq(min(x), max(x), length.out = 5 + 1) #bins <- seq(min(x), max(x), length.out = params[["value1"]] + 1)
    
    hist(x, breaks = bins, col = "#007bc2", border = "white",
         xlab = "Waiting time to next eruption (in mins)",
         main = "Histogram of waiting times")
    ```
    
    ## Additional Comments <!-- Here the second parameter text2 should be used -->
    
    ```{r, results='asis',echo=FALSE,warning=FALSE}
    print("Addidtional comments"]) #print(params[["text2"]])
    ```

... при запуске runApp() рендеринг также не выполняется, и я получаю эти сообщения об ошибках

Listening on http://127.0.0.1:4084

processing file: report.Rmd
                                                                                                                                                                                                     
output file: report.knit.md

"C:/Users/tueftla/AppData/Local/r-pandoc/r-pandoc/3.1.12.2/pandoc" +RTS -K512m -RTS report.knit.md --to latex --from markdown+autolink_bare_uris+tex_math_single_backslash --output pandoc7fcc19ef2230.tex --lua-filter "C:\Users\tueftla\AppData\Local\R\win-library\4.3\rmarkdown\rmarkdown\lua\pagebreak.lua" --lua-filter "C:\Users\tueftla\AppData\Local\R\win-library\4.3\rmarkdown\rmarkdown\lua\latex-div.lua" --embed-resources --standalone --highlight-style tango --pdf-engine pdflatex --variable graphics --variable "geometry:margin=1in" 
! Sorry, but C:\Users\tueftla\AppData\Local\Programs\MiKTeX\miktex\bin\x64\pdflatex.exe failed.

! The log file contains hopefully all information, to make MiKTeX run again

!   C:\Users\tueftla\AppData\Local\MiKTeX\miktex\log\pdflatex.log

Warning: Error in : LaTeX failed to compile C:\Users\tueftla\AppData\Local\Temp\Rtmp2rsGxa\file7fcc51044777.tex. See https://yihui.org/tinytex/r/#debugging for debugging tips. See file7fcc51044777.log for more info.
  1: runApp

файл журнала (C:\Users\tueftla\AppData\Local\MiKTeX\miktex\log\pdflatex.log)

2024-03-11 16:51:35,134+0100 INFO  pdflatex - this process (24692) started by Rgui in directory C:\Users\tueftla\R with command line: C:\Users\tueftla\AppData\Local\Programs\MiKTeX\miktex\bin\x64\pdflatex.exe -halt-on-error -interaction=batchmode C:\Users\tueftla\AppData\Local\Temp\Rtmp2rsGxa\file7fcc51044777.tex
2024-03-11 16:51:35,134+0100 INFO  pdflatex - running on Windows 10.0.19045
2024-03-11 16:51:35,139+0100 INFO  pdflatex - this is MiKTeX-PDFTEX 4.19.0 (1.40.26) (MiKTeX 24.3)
2024-03-11 16:51:35,170+0100 INFO  pdflatex - allowing known shell commands
2024-03-11 16:51:35,229+0100 INFO  pdflatex - going to create file: pdflatex.fmt
2024-03-11 16:51:35,229+0100 INFO  pdflatex.core - start process: miktex formats build pdflatex --engine pdftex
2024-03-11 16:51:51,269+0100 FATAL pdflatex.core - GUI framework cannot be initialized.
2024-03-11 16:51:51,269+0100 FATAL pdflatex.core - Data: 
2024-03-11 16:51:51,269+0100 FATAL pdflatex.core - Source: Libraries\MiKTeX\UI\Qt\mikuiqt.cpp:126
2024-03-11 16:51:51,273+0100 FATAL pdflatex - GUI framework cannot be initialized.
2024-03-11 16:51:51,273+0100 FATAL pdflatex - Info: 
2024-03-11 16:51:51,273+0100 FATAL pdflatex - Source: Libraries\MiKTeX\UI\Qt\mikuiqt.cpp
2024-03-11 16:51:51,273+0100 FATAL pdflatex - Line: 126
2024-03-11 16:51:51,276+0100 INFO  pdflatex - this process (24692) finishes with exit code 1
2024-03-11 16:51:51,283+0100 WARN  pdflatex.core - still open: C:/Users/tueftla/AppData/Local/Temp/Rtmp2rsGxa/file7fcc51044777.tex
2024-03-11 16:51:51,283+0100 WARN  pdflatex.core - still open: file7fcc51044777.log
'"pdflatex"' not found кажется явной ошибкой. Если вы рендерите это на своем ноутбуке (не развернутом на блестящем сервере), то возвращает ли Sys.which("pdflatex") что-то кроме ""?
r2evans 11.03.2024 17:02

@r2evans Да, я рендерю это на своем ноутбуке, и при вводе Sys.which("pdflatex") в моей консоли выводятся две строки: pdflatex (первая строка) и "" (вторая строка).

tueftla 11.03.2024 18:27

Это означает, что он либо не установлен, либо не находится в PATH, который использует ваша латексная цепочка. Если вы используете tinytex, я думал, что он будет установлен по умолчанию, поэтому, возможно, ваша установка tinytex пошла не так, я предлагаю вам просмотреть устранение неполадок для этого пакета и посмотреть, поможет ли это (или, возможно, просто вызвать tinytex::reinstall_tinytex(), хотя это долго/трудно делать).

r2evans 11.03.2024 19:11

@r2evans После переустановки tinytexcommad Sys.which("pdflatex"), вероятно, даст ожидаемый результат: "C:\\Users\\tueftla\\AppData\\Local\\Programs\\MiKTeX\\mikte‌​x\\bin\\x64\\pdflate‌​x.exe". Но теперь report.Rmd завершается сбоем во втором фрагменте кода (строки print(params[["text1"]]) ``` ) с сообщением об ошибке Warning: Error in eval: Objekt 'params' not found

tueftla 11.03.2024 19:55

рад, что ты понял одну вещь... не вижу ничего очевидного, что могло бы вызвать 'params' not found ...

r2evans 11.03.2024 20:29

@r2evans Единственное, что я узнал в результате небольшого исследования Google, — это глобальная переменная темы. Видите ли вы здесь ошибку в переносе params из app.R в report.Rmd?

tueftla 11.03.2024 20:40

Это отличный вопрос. По своему опыту я обнаружил, что когда я визуализирую документ и в вызывающей среде есть params=, render жалуется и происходит сбой. Попробуйте переименовать свой список во что-нибудь другое, то есть myparms <- list(text1=input$caption, ...), а затем render(..., params=myparms). (Это не объясняет формулировку этой ошибки, но, возможно, это немного поможет.)

r2evans 11.03.2024 20:52

Давайте продолжим обсуждение в чате.

tueftla 11.03.2024 21:30
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
8
60
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Использование <!-- ... --> в качестве комментария работает только в одном месте: в содержимом документа с уценкой R. В вашем документе с уценкой R такие комментарии есть перед заголовком YAML, внутри заголовка YAML и внутри фрагментов кода R, и ни один из них не будет анализироваться или работать правильно.

Адаптация вашего кода с учетом вышеуказанных изменений. (Без изменений app.R.)

отчет.Rmd

---
title: "My R Markdown Document"
author: "tueftla"
date: "`r format(Sys.time(), '%d.%m.%Y')`"
output: html_document
params:
  text1: NA
  text2: NA
  value1: NA
---

```{r include=FALSE}
library(knitr)
```
 
## Abstract <!-- Here the first parameter text1 should be used -->
 
```{r, results='asis',echo=FALSE,warning=FALSE}
print(params[["text1"]])
```
 

## Histogram <!-- Here the third parameter value1 should be used -->
 
```{r results='asis',echo=FALSE,warning=FALSE}
x <- faithful$waiting
bins <- seq(min(x), max(x), length.out = params[["value1"]] + 1)

hist(x, breaks = bins, col = "#007bc2", border = "white",
     xlab = "Waiting time to next eruption (in mins)",
     main = "Histogram of waiting times")
```

## Additional Comments <!-- Here the second parameter text2 should be used -->

```{r, results='asis',echo=FALSE,warning=FALSE}
print(params[["text2"]])
```

Благодаря этому я могу визуализировать как HTML, так и PDF-файл, после изменения output_format= и расширения имени файла, причем оба без ошибок.

Спасибо за вашу поддержку и тестирование, работает ли это в вашей системе. Это заставляет меня сосредоточиться на своей системе, а не на коде...

tueftla 25.03.2024 13:31
Ответ принят как подходящий

Спасибо r2evans за поддержку в поиске решения. Чрезвычайно полезным было то, что он мог выполнить код, а также получить отчет — в HTML и PDF.

Значит проблема в моей системе...

К сожалению, я не уверен насчет порядка отдельных шагов, но я суммирую все выполненные мною отдельные шаги, которые привели к получению отчета в формате HTML и PDF.

  1. Установите MiKTeX с однопользовательской версией
    • Если возникает вопрос, как следует установить недостающие пакеты, выберите вариант ВСЕГДА (см. вопрос Rstudio pdflatex.exe не удалось)
  2. Свяжите все необходимые пакеты с помощью pacman::p_load(c("shiny", "pandoc", "tinytex", "bookdown", "markdown", "rmarkdown", "knitr"), character.only = TRUE)
  3. Активируйте последнюю версию pandoc через pandoc_activate()
  4. Удалите комментарии в отчете. Rmd, как сказал r2evans.
  5. И, конечно же, выходной файл в app.R и report.Rmd должен быть в формате html или pdf.
  6. Запустите приложение с помощью runApp() и нажмите кнопку загрузки.
  7. Файл (html или pdf) загружается в папку, в которую его загружает браузер (см. вопрос и ответ от Микко Марттилы Укажите папку назначения для загрузки из приложения R Shiny)

Другие вопросы по теме