Как мне вставить учебные вопросы от «обучающегося» в полноценное блестящее приложение?

Я пытаюсь встроить учебник 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 callrunApp () _ 10_runApp () _ 11_runApp () _ 12_

Я уже обнаружил, что могу создавать блоки вопросов, используя функцию 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 файла для блестящего приложения. Это возможно?


person Carolyn    schedule 09.04.2019    source источник
comment
Я не знаю пакета learnr, так что извините, если я веду себя глупо, но если руководство предварительно отрисовано, можете ли вы просто встроить его в свой html с помощью <iframe>?   -  person Phil    schedule 09.04.2019
comment
когда заголовок tutorial.Rmd фактически создает html (для заголовка установлено значение output: html_document), он больше не является интерактивным (в средстве просмотра / открытии в браузере). Я не думаю, что сработает встроить его как необработанный html в блестящий пользовательский интерфейс, используя что-то вроде того, что было найдено здесь. (Но я пытаюсь это сейчас)   -  person Carolyn    schedule 09.04.2019
comment
Я думаю, что, к сожалению, мне может понадобиться просто установить ссылку на другое блестящее приложение. Инструкции для найденного здесь   -  person Carolyn    schedule 09.04.2019
comment
Вместо того, чтобы встроить учебник в другое блестящее приложение, разве вы не можете расширить свое руководство, включив в него дополнительные материалы? Вы могли бы тогда опубликовать все это как один блестящий экземпляр? rmarkdown.rstudio.com/authoring_shiny_prerendered.html и rstudio.github.io/learnr/publishing.html может оказаться полезным?   -  person Phil    schedule 09.04.2019
comment
Меня просто беспокоит степень, в которой Rmd может выполнять форматирование, которое я ищу, но я думаю, что вы правы, это, вероятно, путь, если мне действительно нужен встроенный учебник.   -  person Carolyn    schedule 10.04.2019


Ответы (2)


Помимо моего предложения включить ваш дополнительный материал в 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. Вставить учебник

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

person Phil    schedule 09.04.2019
comment
Спасибо, что изучили это! Конечно, это работает как шарм. Только когда приложение запускается в браузере, что, если я понимаю, как приложения Shiny запускаются локально при разработке в RStudio, также имеет смысл. Спасибо еще раз! - person Carolyn; 10.04.2019
comment
Не стоит беспокоиться. Примите один из ответов, чтобы другие увидели, что проблема решена. Удачи - person Phil; 10.04.2019

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

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

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

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

person Gregor de Cillia    schedule 09.04.2019