Как я могу динамически рендерить блестящие элементы из файла Rmd на сайт в этом случае? - PullRequest
0 голосов
/ 18 марта 2020

Я пытался реализовать следующее:

  • Блестящий файл приложения app.R доступный с веб-сайта, сборка с блестящей приборной панелью
  • Rmarkdown файл RMarkdownFile.Rmd отображается в приложении. R
  • Блестящий файл модуля fantasticModuleFile.R , содержащий информацию для вывода на веб-сайте

Проблема в том, что когда я пытаюсь запустить app.R с двумя различными способами рендеринга, происходят две вещи:

  • ошибка 1: путь для html_dependency не указан
  • ошибка 2: <!–html_preserve–> и dynamici c элементы не отображаются (sliderInput, selectInput)

Когда я запускаю отдельный модуль, он отлично отрисовывается с обоими подходами и выдает проблемы в браузере.

Все они пишутся и запускаются из RStudio.

Я подозреваю, что проблема может заключаться в рендеринге файлов Rmd, содержащих динамические c блестящие элементы (такие как sliderInput / selectInput) вместо фиксированных (например, цифра ricInput / TextInput). Я безуспешно пробовал много разных вещей.

Кто-нибудь может мне помочь с этим? Заранее спасибо!

app.R


    includeRmd <- function(path){
      contents <- paste(readLines(path, warn = FALSE), collapse = '\n')
      html <- knit2html(text = contents, fragment.only = TRUE, options=c("use_xhtml","smartypants","mathjax","highlight_code", "base64_images"))
      Encoding(html) <- 'UTF-8'
      HTML(html)
    }

    # in UI function:
    uiOutput('mymarkdown')

    server <- function(input, output) {
      options(shiny.maxRequestSize=3000*1024^2) 
      output$mymarkdown <- renderUI({ 
        includeHTML(rmarkdown::render("RMarkdownFile.Rmd"))   #Gives error 1
      })
      output$mymarkdown <- renderUI({ 
        includeRmd("RMarkdownFile.Rmd")   #Gives error 2
      })
    }

RMarkdownFile.Rmd

    ---
    title: "RMarkdownFile"
    output: html_document
    runtime: shiny
    keep_md: yes
    ---
    ```{r, echo=FALSE}
    source("modules/shinyModuleFile.R")

    mymodule_ui("mod3")
    callModule(mymodule_server, "mod3", multiply_by=9)

    `` `
    #the space in the last line is only for editing purposes here (does not exist in original file)

блестящийModuleFile .R


    mymodule_ui <- function(id) {
      ns <- NS(id)
      div(
        selectInput(inputId = ns("number"), label = strong("Quality control"),choices = c(2, 3, 4),selected = 2),
        textOutput(ns("result"))

      )
    }

    # callModule( ) will magically prefix ids for us in the server function
    mymodule_server <- function(input, output, session, multiply_by) {
      output$result <- renderText({
        paste0(input$number, " times ", multiply_by, " is ", as.numeric(input$number) * multiply_by) 
      })
    }


    # Use the module in an app
    ui_mult <- fluidPage(
      titlePanel("Demonstration of modules"),
      h2("Instance 1"),
      mymodule_ui("mod1"))

    server_mult <- function(input, output, session) {
      callModule(mymodule_server, "mod1", multiply_by=3)

      #Debugging
      observe( print(reactiveValuesToList(input)) )
    }

    shinyApp(ui_mult, server_mult)

РЕДАКТИРОВАТЬ 1 В основном мне удалось найти решение

app.R

# in UI function:
uiOutput('mymarkdown')

server <- function(input, output) {
  options(shiny.maxRequestSize=3000*1024^2) 
  output$mymarkdown <- renderUI({ 
    includeHTML(rmarkdown::render("RMarkdownFile.Rmd"))  
}

RMarkdownFile.Rmd

    ---
    title: "RMarkdownFile"
    output: html_document
    runtime: shiny
    keep_md: yes
    ---
    ```{r, echo=FALSE}
    source("modules/teste.R")

    ui_mult <- fluidPage(
      mymodule_ui("mod1"),
      mymodule_ui("mod2")
      )

    server_mult <- function(input, output, session) {
      callModule(mymodule_server, "mod1", multiply_by=3)
      callModule(mymodule_server, "mod2", multiply_by=23)
    }

    shinyApp(ui_mult, server_mult)
    ```

fantasticModuleFile.R


    mymodule_ui <- function(id) {
      ns <- NS(id)
      div(
        selectInput(inputId = ns("number"), label = strong("Quality control"),choices = c(2, 3, 4),selected = 2),
        textOutput(ns("result"))

      )
    }

    # callModule( ) will magically prefix ids for us in the server function
    mymodule_server <- function(input, output, session, multiply_by) {
      output$result <- renderText({
        paste0(input$number, " times ", multiply_by, " is ", as.numeric(input$number) * multiply_by) 
      })
    }


В моем понимании, это добавляет блестящее приложение внутри Главное приложение. Блестящее приложение (таким образом, оно отображается правильно). введите описание изображения здесь

...