From 3a44abd9cadd233127d8701cd8d78f6318b494a0 Mon Sep 17 00:00:00 2001 From: JJ Allaire Date: Thu, 15 Oct 2020 20:18:13 -0400 Subject: [PATCH 1/6] support server.R in cases where shinyrmd has no server contexts --- R/shiny_prerendered.R | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/R/shiny_prerendered.R b/R/shiny_prerendered.R index 98af768b32..51f5c76067 100644 --- a/R/shiny_prerendered.R +++ b/R/shiny_prerendered.R @@ -45,8 +45,22 @@ shiny_prerendered_app <- function(input_rmd, render_args) { # remove server code before serving server_contexts <- c("server-start", "data", "server") - html_lines <- shiny_prerendered_remove_contexts(html_lines, server_contexts) - html <- HTML(one_string(html_lines)) + redacted_html_lines <- shiny_prerendered_remove_contexts(html_lines, server_contexts) + + # if there were server contexts then update html w/ removed contexts + if (length(redacted_html_lines) < length(html_lines)) { + html <- HTML(one_string(redacted_html_lines)) + } + # if there were not server contexts then this may be a ui-only rmd, + # check for a server.R + else if (file.exists(file.path(dirname(input_rmd), "server.R"))) { + server_src <- file.path(dirname(input_rmd), "server.R") + server <- source(server_src)$value + } else { + stop("No server contexts or server.R available for ", input_rmd) + } + + # attach dependencies to final html html <- htmltools::attachDependencies(html, deps) # create shiny app From 4263b7f0d30de5d8cc337f7131754022a9f3b970 Mon Sep 17 00:00:00 2001 From: JJ Allaire Date: Fri, 16 Oct 2020 07:16:03 -0400 Subject: [PATCH 2/6] add local = FALSE arg --- R/shiny_prerendered.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/shiny_prerendered.R b/R/shiny_prerendered.R index 51f5c76067..a1971c6fcd 100644 --- a/R/shiny_prerendered.R +++ b/R/shiny_prerendered.R @@ -55,7 +55,7 @@ shiny_prerendered_app <- function(input_rmd, render_args) { # check for a server.R else if (file.exists(file.path(dirname(input_rmd), "server.R"))) { server_src <- file.path(dirname(input_rmd), "server.R") - server <- source(server_src)$value + server <- source(server_src, local = FALSE)$value } else { stop("No server contexts or server.R available for ", input_rmd) } From 0b9ec8d231d655e7f8f992dd618e9de37459f818 Mon Sep 17 00:00:00 2001 From: JJ Allaire Date: Fri, 16 Oct 2020 07:16:54 -0400 Subject: [PATCH 3/6] allow ui.Rmd for rmarkdown::run --- R/shiny.R | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/R/shiny.R b/R/shiny.R index 0f5f836c92..8fabb29c3a 100644 --- a/R/shiny.R +++ b/R/shiny.R @@ -66,6 +66,15 @@ run <- function(file = "index.Rmd", dir = dirname(file), default_file = NULL, auto_reload = TRUE, shiny_args = NULL, render_args = NULL) { + # if the file argument is missing then substitute ui.Rmd if it exists + # (and index.Rmd does not exist) + if (missing(file) && missing(default_file)) { + if (!file.exists(file.path(dir, "index.Rmd")) && + file.exists(file.path(dir, "ui.Rmd"))) { + file <- file.path(dir, "ui.Rmd") + } + } + # select the document to serve at the root URL if not user-specified. We exclude # documents which start with a leading underscore (same pattern is used to # designate "sub-documents" in R Markdown websites and bookdown) @@ -75,8 +84,8 @@ run <- function(file = "index.Rmd", dir = dirname(file), default_file = NULL, # just one R Markdown document default_file <- allRmds } else { - # more than one: look for an index - index <- which(tolower(allRmds) == "index.rmd") + # more than one: look for an index or ui + index <- which(tolower(allRmds) %in% c("index.rmd", "ui.rmd")) if (length(index) > 0) { default_file <- allRmds[index[1]] } else { @@ -94,7 +103,7 @@ run <- function(file = "index.Rmd", dir = dirname(file), default_file = NULL, if (is.null(default_file)) { # no R Markdown default found; how about an HTML? - indexHtml <- list.files(dir, "index.html?", ignore.case = TRUE) + indexHtml <- list.files(dir, "(index|ui).html?", ignore.case = TRUE) if (length(indexHtml) > 0) default_file <- indexHtml[1] } From febc25582d8ce3e2edec05e52cd100b84328d7d1 Mon Sep 17 00:00:00 2001 From: JJ Allaire Date: Fri, 16 Oct 2020 07:57:23 -0400 Subject: [PATCH 4/6] support for global.R --- R/render.R | 6 ++++++ R/shiny_prerendered.R | 12 ++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/R/render.R b/R/render.R index f28247d59b..29e64a77d6 100644 --- a/R/render.R +++ b/R/render.R @@ -447,6 +447,12 @@ render <- function(input, else stop("The shiny package is required for shinyrmd documents") + # source global.R if it exists + global_r <- file.path.ci(".", "global.R") + if (file.exists(global_r)) { + source(global_r, local = envir) + } + # force various output options output_options$self_contained <- FALSE output_options$dependency_resolver <- function(deps) { diff --git a/R/shiny_prerendered.R b/R/shiny_prerendered.R index a1971c6fcd..420b3b56d2 100644 --- a/R/shiny_prerendered.R +++ b/R/shiny_prerendered.R @@ -54,8 +54,16 @@ shiny_prerendered_app <- function(input_rmd, render_args) { # if there were not server contexts then this may be a ui-only rmd, # check for a server.R else if (file.exists(file.path(dirname(input_rmd), "server.R"))) { - server_src <- file.path(dirname(input_rmd), "server.R") - server <- source(server_src, local = FALSE)$value + # source global.R onStart + onStart <- function() { + global_r <- file.path.ci(dirname(input_rmd), "global.R") + if (file.exists(global_r)) { + source(global_r, local = FALSE) + } + } + # server function from server.R + server_r <- file.path(dirname(input_rmd), "server.R") + server <- source(server_r, local = FALSE)$value } else { stop("No server contexts or server.R available for ", input_rmd) } From a02a7b85205c662db0403a006d99a43e566eeed4 Mon Sep 17 00:00:00 2001 From: JJ Allaire Date: Fri, 16 Oct 2020 21:18:16 -0400 Subject: [PATCH 5/6] source server.R into child of global environment --- R/shiny_prerendered.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/shiny_prerendered.R b/R/shiny_prerendered.R index 420b3b56d2..f88f7f0ee1 100644 --- a/R/shiny_prerendered.R +++ b/R/shiny_prerendered.R @@ -63,7 +63,7 @@ shiny_prerendered_app <- function(input_rmd, render_args) { } # server function from server.R server_r <- file.path(dirname(input_rmd), "server.R") - server <- source(server_r, local = FALSE)$value + server <- source(server_r, local = new.env(parent = globalenv()))$value } else { stop("No server contexts or server.R available for ", input_rmd) } From 7cc7c85a75d94951bb7cd3492700269a653230ad Mon Sep 17 00:00:00 2001 From: JJ Allaire Date: Wed, 21 Oct 2020 06:22:35 -0400 Subject: [PATCH 6/6] Enable use of `server.R` and `global.R` alongside `runtime: shinyrmd` documents. --- NEWS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS.md b/NEWS.md index ff9d6e2313..5c3d9329c5 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,6 +1,7 @@ rmarkdown 2.6 ================================================================================ +- Enable use of `server.R` and `global.R` alongside `runtime: shinyrmd` documents. rmarkdown 2.5 ================================================================================