Передача параметров уценки R в исходный скрипт R - PullRequest
0 голосов
/ 10 января 2020

У меня есть приложение Shiny, в котором пользователи могут выбирать параметры, которые передаются в параметризованный отчет об уценке R. Затем Rmd предоставляет набор сценариев R для извлечения и обобщения данных, создания графиков и т. Д. c. для отчета.

Сценарий, который я использую для извлечения данных, включает в себя параметризованный запрос SQL, который наследует значения от уценки R params (которые, в свою очередь, наследуются от Shiny input). Тем не менее, весь процесс останавливается на этом этапе, и я получаю сообщение о том, что params не существует.

Я вполне уверен, что передача входных данных из параметров Shiny в параметры R уценки работает нормально - поэтому, похоже, проблема заключается в передаче их в сценарий с источником (примечание: это просто сценарий R, а не функция ). Я предполагаю, что это как-то связано со средой, к которой скрипт обращается, когда он получен (хотя он использует соединение с базой данных, сгенерированное в предыдущем фрагменте в уценке R без проблем) - но кроме этого, немного потеряно в отношении как исправить это. Любые идеи будут высоко оценены.

Вот приложение Shiny:

##########################################
# SHINY APP - USER INTERFACE:

ui = fluidPage (
    selectInput("pathogen", "Enter pathogen of interest:", c("Campylobacter" = "Campylobacter", "Escherichia" = "Escherichia",
                "Salmonella" = "Salmonella", "Shigella" = "Shigella"), selected = "Salmonella" ),

    radioButtons("pkginstall", "Install required packages?",  c("Yes" = "yes", "No" = "no"),selected = "yes"),

    downloadButton("report", "Generate report")
)


##########################################
# SHINY APP - SERVER LOGIC:

#fileInput("download_location","Select File Location"),
server = function(input, output) {
    # Create the output: 
    output$report = downloadHandler(

      filename = paste0("Pathogen Report ", input$pathogen, "_", format(Sys.time(),"%d-%b-%Y %H.%M"), ".html"),

      content = function(file) {

        # Copy the .Rmd to a temporary directory:
        tempReport <- file.path(tempdir(), "Pathogen_Report.Rmd")
        file.copy("Pathogen_Report.Rmd", tempReport, overwrite = TRUE)


        # Set up parameters to pass to Rmd document:
        params <- list(pathogen = input$pathogen, pkginstall = input$pkginstall)

        # Define name of report:
        outname <- paste0("Pathogen Report ", input$pathogen, "_", format(Sys.time(),"%d-%b-%Y %H.%M"), ".html") 

        # Knit the document:
        created_filename <- rmarkdown::render(input = tempReport, 
                          output_file = outname, 
                          params = params,
                          envir = new.env(parent = globalenv())
                          )
        file.rename(created_filename, file)
      }
    )
  }

##########################################
# SHINY APP - RUN:

# Run app:
shinyApp(ui =ui, server=server)

##################################################################

А вот заголовок YAML уценки R:

---
params:
  pathogen: 
    label: "Enter pathogen of interest:" 
    value: Shigella
    input: select
    choices: [Campylobacter, Escherichia, Salmonella, Shigella]
title: "Pathogen Report"
date: "`r format(Sys.time(), '%d %B %Y')`"
output: 
  phecharts::html_phe:
    includes:
      in_header: phe_logo.html
---

И соответствующий кусок Источник сценария R:

{r, GDW Query, echo=FALSE, cache=FALSE, message=FALSE, warning=FALSE, results='hide'}
####################################################################
# QUERY DATABASE AND EXTRACT DATA 

source("Extract_data.R")

Extract_data.R содержит запрос SQL, в котором имя патогена должно быть заменено на запрос, унаследованный от параметров уценки R:

# Example SQL to PostgreSQL database:
query <- "SELECT * FROM table1 WHERE table1.organism ~ '^@pathogen'"

# Substituting pathogen for pathogen name from R markdown parameters:
query <- gsub("@pathogen", params$pathogen, query)

# Executing the query:
mydata <- data.table(RPostgres::dbGetQuery(conn = dbcon, statement = query))

Обратите внимание, что соединение с базой данных уже было успешно установлено путем поиска другого сценария в блоке разметки R, предшествующем этому.

Это ошибка, которую я получаю:

Quitting from lines 84-88 (Pathogen_Report.Rmd) 

Warning: Error in gsub: object 'params' not found
  [No stack trace available]

1 Ответ

0 голосов
/ 11 января 2020

Посмотрите на аргумент local в source (?source).

local TRUE, FALSE или среда, определяющая, где анализируются выражения. FALSE (по умолчанию) соответствует рабочему пространству пользователя (глобальная среда), а TRUE - среде, из которой вызывается источник.

При непосредственном рендеринге Rmd, params являются по умолчанию, и вы находитесь в глобальной среде. Так что это будет работать:

---
params:
  pathogen: 
    label: "Enter pathogen of interest:" 
    value: Shigella
    input: select
    choices: [Campylobacter, Escherichia, Salmonella, Shigella]
  pkginstall:
    value: no
title: "Pathogen Report"
date: "`r format(Sys.time(), '%d %B %Y')`"
output: html_document
---

```{r GDW Query, echo=TRUE, cache=FALSE, message=FALSE, warning=FALSE, results='hide'}
####################################################################
# QUERY DATABASE AND EXTRACT DATA 
source(Extract_data.R, local=FALSE) # same as source(Extract_data.R)

Однако, при запуске от Rmd до Shiny App вы хотите работать в среде, в которой работает Shiny, и вы хотите использовать внешний сценарий как если он был вставлен в строку (см. https://shiny.rstudio.com/articles/scoping.html). Должно работать следующее:

---
params:
  pathogen: 
    label: "Enter pathogen of interest:" 
    value: Shigella
    input: select
    choices: [Campylobacter, Escherichia, Salmonella, Shigella]
  pkginstall:
    value: no
title: "Pathogen Report"
date: "`r format(Sys.time(), '%d %B %Y')`"
output: html_document
---

```{r GDW Query, echo=TRUE, cache=FALSE, message=FALSE, warning=FALSE, results='hide'}
####################################################################
# QUERY DATABASE AND EXTRACT DATA 
source(Extract_data.R, local=TRUE) 
...