Как встраивать учебные вопросы от «learnr» в полноценное блестящее приложение? - PullRequest
3 голосов
/ 09 апреля 2019

Я пытаюсь встроить учебник Rmd из пакета learnr в полностью блестящее приложение.Однако учащийся использует среду выполнения shiny_prerendered, я не могу вызвать ее в своем приложении.Как получить интерактивное учебное пособие для запуска в моем блестящем приложении?

У меня сейчас есть три файла: ui.R, server.R и tutorial.Rmd.

Мой учебник выглядит следующим образом (один `удален для форматирования)

---
title: "my tutorial"
tutorial:
  id: "com.example.tutorials.a-tutorial"
  version: 1.0
output: learnr::tutorial
runtime: shiny_prerendered
---

``{r setup, include=FALSE}
library(learnr)
knitr::opts_chunk$set(echo = FALSE)
``

### Exercise Example
An R code question
``{r add-function, exercise=TRUE, exercise.lines = 5}
add <- function() {

}
``

### Quiz
R Quiz Question
``{r quiz}
quiz(
  question("Question 1",
    answer("wrong"),
    answer("also wrong"),
    answer("right", correct = TRUE),
    answer("wrong again")
  )
)
``

Когда я пытаюсь отобразить вывод этого файла из ui.R, примерно так:

ui <- tagList(
    fluidPage(theme = shinytheme("cosmo")),
    navbarPage(
       "appTitle",
       tabPanel("Embedding Tutorials?", 
          includeMarkdown("tutorial.Rmd")
       ),
    )
)

Он (я полагаю, правильно) отображает его как обычный старый файл Rmd, а не как интерактивный учебник.

Я также пытался использовать rmarkdown::render("tutorial.Rmd"), который просто отображает путь к файлу html, сгенерированный Rmd (/Users/me/app/tutorial.html).

Когда я пытаюсь выполнить рендеринг любого учебника, используя run_tutorial("hello", package="learnr"), он (опять же, по праву) выдает ошибку ERROR: Can't call runApp () from within runApp () . If your application code contains runApp () , please remove it.

Я уже обнаружил, что могу создавать блоки вопросов с помощью функции question() в learnr, используя следующее:

ui <- tagList(
    fluidPage(theme = shinytheme("cosmo")),
    navbarPage(
       "appTitle",
       tabPanel("Tutorial", 
             quiz(
               question("Quiz question",
                        answer("1"),
                        answer("2"),
                        answer("3", correct = TRUE),
                        answer("4"),
                        allow_retry = TRUE
               )
       ),
    )
)

Но это не позволяет использовать функциональность создания фрагментов кода Rкоторый можно запустить в приложении.

Мне нужен полностью интерактивный учебник, который можно воспроизвести в файле ui.R для блестящего приложения.Это возможно?

Ответы [ 2 ]

1 голос
/ 09 апреля 2019

Помимо моего предложения включить ваш дополнительный материал в учебник learnr, я также получил <iframe> встраивание для работы. Создайте app.R со следующим содержимым:

#
# This is a Shiny web application. You can run the application by clicking
# the 'Run App' button above.
#
# Find out more about building applications with Shiny here:
#
#    http://shiny.rstudio.com/
#

library(shiny)

# Define UI for application that draws a histogram
ui <- fluidPage(

    # Application title
    titlePanel("learnr tutorial"),

    # Show a plot of the generated distribution
    mainPanel(fluidRow(
       htmlOutput("frame")
    ))
)

# Define server logic required to draw a histogram
server <- function(input, output) {

    output$frame <- renderUI({
        tags$iframe(
            src="https://jjallaire.shinyapps.io/learnr-tutorial-03a-data-manip-filter/", width=1280, height=720
        )
    })
}

# Run the application
shinyApp(ui = ui, server = server)

Теперь, когда вы Run App, вы должны вставить пример учебника из https://rstudio.github.io/learnr/

По-видимому, необходимо, чтобы учебное пособие было обработано и опубликовано на shinyapps.io и т. Д. Я не смог заставить его работать только из отрисованного файла html. Таким образом,

  1. Создать учебник
  2. Учебник по публикации
  3. Учебник по встраиванию

кажется, что путь вперед.

0 голосов
/ 10 апреля 2019

Вообще говоря, есть два способа встраивания интерактивных документов RMarkdown в блестящие приложения.

(1) Обычный способ (предложенный @Phil) состоит в том, чтобы один R-сервер выполнял встроенное руководство, а другой - приложение. Это может быть заархивировано путем развертывания учебника сначала через shinyapps.io или глянцевый сервер, а затем с помощью iframe. Кроме того, вы можете использовать callr::r_bg() для запуска учебника в локальном фоновом процессе. В любом случае это сделает так, чтобы документ Rmd не мог взаимодействовать с блестящим приложением. Если это возможно для вашего варианта использования, я бы предложил этот вариант.

(2) Более сложный способ обрисован здесь сопровождающим пакета shinyAce. Он использует один и тот же R-сервер для основного приложения и встроенный Rmd-документ. См. Также этот вопрос . AFAIK, это работает только с knitr::knit2html, который опирается на устаревшую версию RMarkdown. Кроме того, количество функций render* и output*, доступных таким способом, ограничено, если только вы не убедитесь, что определенные ресурсы JavaScript и CSS правильно включены в определение пользовательского интерфейса.

Прошло довольно много времени с тех пор, как я обдумал эту тему, но в то время у меня сложилось впечатление, что (2) требуется довольно много работы и действительно ограничивает ваши возможности.

...