В моем приложении 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
@r2evans Да, я рендерю это на своем ноутбуке, и при вводе Sys.which("pdflatex")
в моей консоли выводятся две строки: pdflatex
(первая строка) и ""
(вторая строка).
Это означает, что он либо не установлен, либо не находится в PATH, который использует ваша латексная цепочка. Если вы используете tinytex
, я думал, что он будет установлен по умолчанию, поэтому, возможно, ваша установка tinytex
пошла не так, я предлагаю вам просмотреть устранение неполадок для этого пакета и посмотреть, поможет ли это (или, возможно, просто вызвать tinytex::reinstall_tinytex()
, хотя это долго/трудно делать).
@r2evans После переустановки tinytex
commad Sys.which("pdflatex")
, вероятно, даст ожидаемый результат: "C:\\Users\\tueftla\\AppData\\Local\\Programs\\MiKTeX\\miktex\\bin\\x64\\pdflatex.exe"
. Но теперь report.Rmd завершается сбоем во втором фрагменте кода (строки print(params[["text1"]]) ```
) с сообщением об ошибке Warning: Error in eval: Objekt 'params' not found
рад, что ты понял одну вещь... не вижу ничего очевидного, что могло бы вызвать 'params' not found
...
@r2evans Единственное, что я узнал в результате небольшого исследования Google, — это глобальная переменная темы. Видите ли вы здесь ошибку в переносе params
из app.R
в report.Rmd
?
Это отличный вопрос. По своему опыту я обнаружил, что когда я визуализирую документ и в вызывающей среде есть params=
, render
жалуется и происходит сбой. Попробуйте переименовать свой список во что-нибудь другое, то есть myparms <- list(text1=input$caption, ...)
, а затем render(..., params=myparms)
. (Это не объясняет формулировку этой ошибки, но, возможно, это немного поможет.)
Давайте продолжим обсуждение в чате.
Использование <!-- ... -->
в качестве комментария работает только в одном месте: в содержимом документа с уценкой R. В вашем документе с уценкой R такие комментарии есть перед заголовком YAML, внутри заголовка YAML и внутри фрагментов кода R, и ни один из них не будет анализироваться или работать правильно.
Адаптация вашего кода с учетом вышеуказанных изменений. (Без изменений app.R
.)
---
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=
и расширения имени файла, причем оба без ошибок.
Спасибо за вашу поддержку и тестирование, работает ли это в вашей системе. Это заставляет меня сосредоточиться на своей системе, а не на коде...
Спасибо r2evans за поддержку в поиске решения. Чрезвычайно полезным было то, что он мог выполнить код, а также получить отчет — в HTML и PDF.
Значит проблема в моей системе...
К сожалению, я не уверен насчет порядка отдельных шагов, но я суммирую все выполненные мною отдельные шаги, которые привели к получению отчета в формате HTML и PDF.
pacman::p_load(c("shiny", "pandoc", "tinytex", "bookdown", "markdown", "rmarkdown", "knitr"), character.only = TRUE)
pandoc_activate()
runApp()
и нажмите кнопку загрузки.
'"pdflatex"' not found
кажется явной ошибкой. Если вы рендерите это на своем ноутбуке (не развернутом на блестящем сервере), то возвращает лиSys.which("pdflatex")
что-то кроме""
?