Могу ли я вызвать функцию (не модуль) из блестящего модуля? Могу ли я передать реактивные значения модуля в качестве аргументов функции - PullRequest
0 голосов
/ 07 июня 2019

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

Функция создает команду запроса sql на основе номера mrn, startdate и enddate, который предполагается передать в функцию из 'modemtab'.

это ошибка, которую я получаю: Ошибка в .getReactiveEnvironment () $ currentContext (): Операция не допускается без активного реактивного контекста. (Вы пытались сделать что-то, что можно сделать только из реактивного выражения или наблюдателя.)

Я понимаю, что это потому, что я передаю реактивные значения, а не их содержимое, в функцию. У меня вопрос, как я могу передать содержимое этих реактивных значений.

Я включил здесь часть своего кода.

Спасибо.

app_server <- function(input, output,session) {
.
.
# getting csvupload_values from the first module and feeding it into the next.

csvupload_values <- callModule(csvupload, 'csv-upload')
callModule(modemtab,'mrntab', csvupload_values)


modemtab <- function(input, output, session, csvupload_values){

# the ouput$query is made in the UI part, but it's not the cause of issue.

output$query <- renderText({
    if(!is.null(csvupload_values$file_uploaded())){
      make_query(mrns = csvupload_values$file_uploaded()$mrns, 
                     startDate = csvupload_values$dates()[1], 
                     endDate = csvupload_values$dates()[2])


}




#This is the function called from within the second module (modemtab)
#this function is saved as a separate file in R folder 

    make_query <- function(...){
      glue_sql("
               select *
               FROM table
               WHERE
                 rgn_cd = {`rgn_cd`}
                 AND prdct_lne_cd = {`lob`}
                 AND ENCTR_STRT_TS >= {`startDate`}
                  AND ENCTR_END_TS <= {`endDate`}
                 "
               ,...
               ,.con = DBI::ANSI())
    }


csvuploadUI <- function(id){
  ns <- NS(id)
  tagList(
    fileInput(ns('file'), "Choose CSV File",
              accept = c("text/csv",
                         "text/comma-separated-values,text/plain",
                         ".csv")),


    dateRangeInput(
      ns('mrn_date_range'), label = 'Select the range of date:', 
      start = NULL, end = NULL, min = NULL,
      max = NULL, format = "mm/dd/yyyy", 
      startview = "month", weekstart = 0,
      language = "en", separator = " to ", width = NULL),


    # Input: Checkbox if file has header ----
    checkboxInput(ns('header'), "Header", TRUE)

  )

}

# Module Server

csvupload <- function(input, output, session){

  userFile <- reactive({
    # If no file is selected, don't do anything
    validate(need(input$file, message = FALSE))
    input$file
  })

  dataframe <- reactive({
    read.csv(userFile()$datapath,
             header = input$header)
  })


1 Ответ

0 голосов
/ 08 июня 2019

Здесь:

csvupload_values <- callModule(csvupload, 'csv-upload')
callModule(modemtab,'mrntab', csvupload_values)

csvupload_values - реактивный проводник, поэтому вы не можете сделать callModule(modemtab,'mrntab', csvupload_values) вне реактивного контекста. Вы можете сделать:

server <- function(input, output,session) {

  csvupload_values <- callModule(csvupload, 'csv-upload')

  observeEvent(csvupload_values(),{
    if(!is.null(csvupload_values())){
      callModule(modemtab, 'mrntab', csvupload_values)    
    }
  })

}

Теперь, csvupload_values() - это фрейм данных, когда вы загрузили файл, поэтому я не понимаю, почему вы делаете csvupload_values$file_uploaded(). Вот полный пример:

modemtabUI <- function(id){
  ns <- NS(id)
  textOutput(ns("query"))
}

modemtab <- function(input, output, session, csvupload_values){
  output$query <- renderText({
    colnames(csvupload_values())
  })
}

csvuploadUI <- function(id){
  ns <- NS(id)
  tagList(
    fileInput(ns('file'), "Choose CSV File",
              accept = c("text/csv",
                         "text/comma-separated-values,text/plain",
                         ".csv")),

    checkboxInput(ns('header'), "Header", TRUE),

    dateRangeInput(
      ns('mrn_date_range'), label = 'Select the range of date:', 
      start = NULL, end = NULL, min = NULL, max = NULL, format = "mm/dd/yyyy", 
      startview = "month", weekstart = 0,
      language = "en", separator = " to ", width = NULL)
  )
}

csvupload <- function(input, output, session){

  userFile <- reactive({
    # If no file is selected, don't do anything
    validate(need(input$file, message = FALSE))
    input$file
  })

  reactive({
    read.csv(userFile()$datapath, header = input$header)
  })

}

ui <- fluidPage(
  csvuploadUI("csv-upload")
  modemtabUI("mrntab")
)

server <- function(input, output,session) {

  csvupload_values <- callModule(csvupload, 'csv-upload')

  observeEvent(csvupload_values(),{
    if(!is.null(csvupload_values())){
      callModule(modemtab, 'mrntab', csvupload_values)    
    }
  })

}

shinyApp(ui, server)
...