I am really struggling to get this one down. I have searched here and all over but I am not sure what I am doing wrong. I apologize as this maybe a really silly question.But I am a novice.
I have put in place a shiny application, where it renders an existing R markdown file which is compiled based on the Shiny inputs. In the end I get what is like a PDF file. Everything works fine except for the option to download. When I push the download, it just opens another webpage session from the beginning.
How can get the final document displayed as an PDF file downloaded. Really appreciate any help.
I edited this code based on a shiny example, but still cannot get to the bottom of this. When I click on the download button it opens another session.
Edited code
library(shiny)
library(knitr)
shinyServer(function(input, output,session) {
library(knitr)
output$markdown <- renderUI({
HTML(markdown::markdownToHTML(knit('RMarkdown_pdf1.Rmd', quiet = TRUE)))
})
output$downloadData <- downloadHandler(
filename = function() {
paste('my-report', sep = '.', switch(
input$format, PDF = 'pdf', HTML = 'html', Word = 'docx'
))
},
content = function(file) {
src <- normalizePath('report.Rmd')
# temporarily switch to the temp dir, in case you do not have write
# permission to the current working directory
owd <- setwd(tempdir())
on.exit(setwd(owd))
file.copy(src, 'report.Rmd')
library(rmarkdown)
out <- render('report.Rmd', switch(
input$format,
PDF = pdf_document(), HTML = html_document(), Word = word_document()
))
file.rename(out, file)
}
)
})
library(shiny)
library(knitr)
shinyUI(
fluidPage(
titlePanel("Drift Report - Beta Version 1.0"),
selectInput("n",
"Number of files:",
choices = c(1,2,3,4)),
checkboxInput("d", label = "Data Summary", value = FALSE),
checkboxInput("k", label = "Drift Plots", value = FALSE),
radioButtons("p", label = "Plot Type",
choices = list("Point Plot" = 1, "Cumm Plot"=2, "Both - Side by Side"=3, "Both - One underneath the Other"=4),selected = NULL,inline=TRUE),
sliderInput("s","No of Plots", min = 1, max = 50, value = 10, width = "40%"),
submitButton("Apply Changes"),
conditionalPanel(
condition = "input.n == 1",
fileInput("dat","File Upload for Analysis", accept = ".eff")
),
radioButtons('format', 'Document format for Download', c('PDF', 'HTML', 'Word'),
inline = TRUE),
conditionalPanel(
condition = "input.n == 2",
fileInput("dat","1st File Upload for Analysis"),
fileInput("dat3","2nd File Upload for Analysis")
),
downloadButton('downloadData', 'Download'),
uiOutput('markdown')
)
)
log
2016-04-26T18:50:56.177858+00:00 shinyapps[98254]: Warning in file(filename, "r", encoding = encoding) :
2016-04-26T18:50:56.177862+00:00 shinyapps[98254]: cannot open file 'datEff.R': No such file or directory
2016-04-26T18:50:56.178919+00:00 shinyapps[98254]: Quitting from lines 10-45 (RMarkdown_pdf1.Rmd)
2016-04-26T18:50:56.180088+00:00 shinyapps[98254]:
2016-04-26T18:50:56.182026+00:00 shinyapps[98254]: cannot open the connection
2016-04-26T18:50:56.182763+00:00 shinyapps[98254]: Warning: Error in file: cannot open the connection
2
The id of your download button is downloadData but in server code you used downloadReport. They don't match.
Related
I'm building a little applet that will run locally, where people can upload a csv and a fillable pdf and the tool will execute a loop that will fill out the pdfs with names from the csv and save them as png files in an /output directory.
I am having trouble with the pdf portion. Using shinyFiles they navigate to the pdf and get its path, but am getting an invalid path error trying to get the pdf fields (staplr). I think it is happening with get_fields but I can't think of another way to get the pdf location.
Warning: Error in path.expand: invalid 'path' argument
[No stack trace available]
Code snip below. Any ideas welcome!
library(tidyverse)
library(staplr)
library(DT)
library(shinyFiles)
library(pdftools)
ui <- fluidPage(
titlePanel(p("Award PDF Creation App", style = "color:#3474A7")),
sidebarLayout(
sidebarPanel(
p("Award Creation Tool"),
# Horizontal line ----
tags$hr(),
fileInput(inputId = "filedata",
label = "Choose your CSV file",
accept = c(".csv")),
shinyFilesButton("pdf", "PDF select", "Please select a PDF", multiple = TRUE, viewtype = "detail"),
tags$p(),
tags$p('Please choose the fillable PDF for award creation.'),
tags$hr()
),
mainPanel(h3("Review your CSV format before you Create PDFs"),
DTOutput(outputId = "table"),
tableOutput("contents"),
actionButton("go", "Create PDFs")
)
)
)
server <- shinyServer(function(input, output, session){
volumes <- c(Home = fs::path_home(), "R Installation" = R.home(), getVolumes()())
shinyFileChoose(input, "pdf", roots = volumes, session = session,
filetypes = c('', 'pdf'))
# by setting `allowDirCreate = FALSE` a user will not be able to create a new directory
pdf <- reactive(input$pdf)
data <- reactive({
req(input$filedata)
read.csv(input$filedata$datapath)
})
pdfpath <- reactive({
req(input$pdf)
as.character(parseFilePaths(volumes,pdf())$datapath)
})
output$table <- renderDT(
data()
)
observeEvent(input$go,{
req(input$filedata)
req(input$pdf)
data <- data()
pdffields <-get_fields(input_filepath = pdfpath, convert_field_names = F)
withProgress(message = 'Making PDFs', value = 0, {
for(i in 1:nrow(data)){
pdffields$`Date`$value <- paste(format(data$AWARD_DATE[i], "%B %d, %Y"))
pdffields$`First Name Last Name`$value <- paste0(data$FIRST_NAME[i], " ", data$LAST_NAME[i])
filename <- paste0('./output/', Sys.Date(),
'_', data$LAST_NAME[i],
'_', data$AWARD[i], '.png')
set_fields(pdf, filename, pdffields)
bitmap <- pdf_render_page(filename, page = 1, dpi = 300)
png::writePNG(bitmap, filename)
# Increment the progress bar, and update the detail text.
incProgress(1/nrow(data), detail = paste("Processing"))
# Pause
Sys.sleep(0.1)
}
})
})
})
shinyApp(ui = ui, server = server)
I am trying to make a shinny app that downloads data from a server, selects a rmarkdown report to run, runs said report, and opens the pdf file that was just rendered in a new window. I was able to do all of that except for the last part.
How can I open the pdf file that was newly rendered using Shiny?
Here is my ui:
ui <- fluidPage(
titlePanel("Input Parameters"),
column(4, wellPanel(
dateInput('date',
label = 'Select the Start Date of the Report:',
value = Sys.Date(),
format = "dd-M-yy"),
dateInput('date2',
label = paste('Select the End Date of the Report:'),
value = Sys.Date(),
format = "dd-M-yy"),
selectInput("report_name", "Select Report to Process:",
c("Report1" = "running_report",
"Report2" = "jogging_report")),
actionButton("button", "Run Report")
)),
column(6,
verbatimTextOutput("dateText"),
verbatimTextOutput("dateText2")
)
)
And this is my server
server <- function(input, output) {
observeEvent(input$button, {
if(input$report_name == "Report1"){
file_location <- "notebooks/running_report.Rmd"
print(file_location)
}else if(input$report_name == "Report2"){
file_location <- "notebooks/jogging_report.Rmd"
print(file_location)
}
#Formating current date as a title
title_date <- format(as.Date(Sys.Date(), "%d-%m-%y"),"%m_%d_%Y")
#Formating the title using the input
title <- substring(input$report_name, regexpr("/", input$report_name) + 1)
title <- strsplit(title, "[.]")[[1]][1]
title <- paste0( title, '_',title_date, sepp='')
detach("package:kableExtra", unload=TRUE)
rmarkdown::render(file_location ,output_file = paste0( title, '_','module_report',title_date, sepp=''), envir = new.env(parent = globalenv()))
detach("package:kableExtra", unload=TRUE)
filename = paste0( title, '_','report_name',title_date,'.pdf', sepp='')
content = function(file) file.copy(filename, file, overwrite = TRUE)
print(title_date)
print(title)
})
}
You can consider opening the PDF with acrobate reader with the following code :
system2(command = "C:/Program Files (x86)/Adobe/Acrobat Reader DC/Reader/AcroRd32.exe", args = "C:/mypdf.pdf")
i'm trying to convert a part of my Rshiny in Rmarkdown, but when i try to run this example i get an error, how can i handle it?
this code is part of an example of Rshiny app, but when i try to run something is wrong
or could you help me to find some script to print some tables and graphs from Rshiny into Rmarkdown?
Aserver <-function(input, output) {
regFormula <- reactive({
as.formula(paste('mpg ~', input$x))
})
output$regPlot <- renderPlot({
par(mar = c(4, 4, .1, .1))
plot(regFormula(), data = mtcars, pch = 19)
})
output$downloadReport <- downloadHandler(
filename = function() {
paste('my-report', sep = '.', switch(
input$format, PDF = 'pdf', HTML = 'html', Word = 'docx'
))
},
content = function(file) {
src <- normalizePath('report.Rmd')
# temporarily switch to the temp dir, in case you do not have write
# permission to the current working directory
owd <- setwd(tempdir())
on.exit(setwd(owd))
file.copy(src, 'report.Rmd', overwrite = TRUE)
library(rmarkdown)
out <- render('report.Rmd', switch(
input$format,
PDF = pdf_document(), HTML = html_document(), Word = word_document()
))
file.rename(out, file)
}
)
}
Aui <- fluidPage(
title = 'Download a PDF report',
sidebarLayout(
sidebarPanel(
helpText(),
selectInput('x', 'Build a regression model of mpg against:',
choices = names(mtcars)[-1]),
radioButtons('format', 'Document format', c('PDF', 'HTML', 'Word'),
inline = TRUE),
downloadButton('downloadReport')
),
mainPanel(
plotOutput('regPlot')
)
)
)
shinyApp(Aui, Aserver)
this is the error
Warning: Error in abs_path: The file 'report.Rmd' does not exist.
[No stack trace available]
Thanks
You should distinghish two paths:
the path where the application is installed/running
the path where you are going to download the result of knitting the Markdown doc
You can get the path where the application is running with getwd().
If you don't explicitly specify a path, the report.Rmd should be located on the same directory as the application so that the application can use it.
Make sure Report.Rmd is in getwd() directory, or specify the path of Report.Rmd :
render(file.path('/custom/directory','report.Rmd'), ...
I need to print a report from a shiny application using r markdown. I have been trying to follow the examples, but after many hours, I need some help.
There are 4 files: app.R, report.Rmd, calculations.R and datos.xlsx
datos.xlsx is an excel file with information to be used by a function defined in calculations.R and used by app.R
app.R is expected to provide the result on the screen and a downloadable report. I do not get the latter and I have been strugling the last two days with this.
Thank you very much!
app.R:
ui <- fluidPage(
titlePanel("Calculations"),
sidebarLayout(
sidebarPanel(
fileInput("file1","Select excel file with data", accept=c("excel",".xlsx",".xls")),
"When are available on the screen, you can download the report",
radioButtons('format', 'Document format', c('PDF', 'HTML', 'Word'),
inline = TRUE),
downloadButton('downloadReport')
),
mainPanel(
tableOutput(outputId = "tabla")
)
))
server <- function(input, output) {
source("./calculations.R")
output$tabla<-renderTable({
infile<-input$file1
if(is.null(infile))return(NULL)
calculo(infile$datapath)})
output$downloadReport <- downloadHandler(
filename = function() {
paste('my-report', sep = '.', switch(
input$format, PDF = 'pdf', HTML = 'html', Word = 'docx'
))
},
content = function(file) {
src <- normalizePath('report.Rmd')
# temporarily switch to the temp dir, in case you do not have write
# permission to the current working directory
owd <- setwd(tempdir())
on.exit(setwd(owd))
file.copy(src, 'report.Rmd', overwrite = TRUE)
library(rmarkdown)
out <- render('report.Rmd', switch(
input$format,
PDF = pdf_document(), HTML = html_document(), Word = word_document()
))
file.rename(out, file)
}
)
}
# Run the application
shinyApp(ui = ui, server = server)
report.Rmd:
title: "Dynamic report"
output: word_document
knitr::opts_chunk$set(echo = FALSE,warning=FALSE,message = FALSE)
Results
print(output$tabla)
calculations.R
library(xlsx)
calculo<-function(archivo){
incrementos_descuentos<-read.xlsx(archivo,sheetName="incrementos - descuentos", check.names = FALSE)
incrementos_descuentos$`Desde / mm`<-as.numeric(as.character(incrementos_descuentos$`Desde / mm`))
incrementos_descuentos$`A / mm`<-as.numeric(as.character(incrementos_descuentos$`A / mm`))
incrementos_descuentos$`Volumen / L`<-as.numeric(as.character(incrementos_descuentos$`Volumen / L`))
incrementos_descuentos$`Resultado L/m`<-as.numeric(as.character(incrementos_descuentos$`Resultado L/m`))
incrementos_descuentos$`Resultado L/m`<-incrementos_descuentos$`Volumen / L`/(incrementos_descuentos$`A / mm`-incrementos_descuentos$`Desde / mm`)
Resutado<-incrementos_descuentos
Resutado
}
It seems that I found the solution, after many days.
I added in app.R a reactive object:
informe <- reactive({
infile<-input$file1
if(is.null(infile))return(NULL)
calculo(infile$datapath)
})
and the I called it from report.Rmd as informe()
I created a R shiny application for stats analyses. I'd like that app allowed users to download a word report. I use the code on the shiny website gallery - http://shiny.rstudio.com/gallery/download-knitr-reports.html.
Server
shinyServer(function(input, output) {
regFormula <- reactive({
as.formula(paste('mpg ~', input$x))
})
output$regPlot <- renderPlot({
par(mar = c(4, 4, .1, .1))
plot(regFormula(), data = mtcars, pch = 19)
})
output$downloadReport <- downloadHandler(
filename = function() {
paste('my-report', sep = '.', switch(
input$format, PDF = 'pdf', HTML = 'html', Word = 'docx'
))
},
content = function(file) {
src <- normalizePath('report.Rmd')
# temporarily switch to the temp dir, in case you do not have write
# permission to the current working directory
owd <- setwd(tempdir())
on.exit(setwd(owd))
file.copy(src, 'report.Rmd')
library(rmarkdown)
out <- render('report.Rmd', switch(
input$format,
PDF = pdf_document(), HTML = html_document(), Word = word_document()
))
file.rename(out, file)
}
)
})
UI
library(shiny)
shinyUI(fluidPage(
title = 'Download a PDF report',
sidebarLayout(
sidebarPanel(
helpText(),
selectInput('x', 'Build a regression model of mpg against:',
choices = names(mtcars)[-1]),
radioButtons('format', 'Document format', c('PDF', 'HTML', 'Word'),
inline = TRUE),
downloadButton('downloadReport')
),
mainPanel(
plotOutput('regPlot')
)
)
))
It works fine and I can download the report on the web app. I use the proposed code in R studio on a OS X computer and it works fine too. I try to do the same with R studio on a win 7 computer but it doesn't works, the report (html, pdf or docx) is not created whereas the apps works fine.
Can someone help me ?
Ari