3

我正在尝试将learnr包中的教程 Rmd 嵌入到一个完整的闪亮应用程序中。但是,学习者使用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")它来渲染 Rmd ( /Users/me/app/tutorial.html) 生成的 html 文件的文件路径。

当我尝试使用 渲染任何教程run_tutorial("hello", package="learnr")时,它(再次正确地)给出错误 ERROR: Can't callrunApp() from withinrunApp() . If your application code containsrunApp(), 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一个闪亮的应用程序的文件中呈现。这可能吗?

4

2 回答 2

1

除了我建议将您的额外材料合并到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. 嵌入教程

似乎是前进的方向。

于 2019-04-09T20:54:00.937 回答
0

一般来说,有两种方法可以在闪亮的应用程序中嵌入交互式 RMarkdown 文档。

(1)通常的方法(由@Phil 提出)是让一台 R 服务器运行嵌入式教程,另一台运行应用程序。这可以通过首先通过 shinyapps.io 或 shiny-server 部署教程然后使用 iframe 来存档。或者,您可以使用callr::r_bg()在本地后台进程中运行教程。无论如何,这将使 Rmd 文档无法与闪亮的应用程序交互。如果这对您的用例可行,我建议您使用此选项。

(2)包的维护者在这里概述了一种更复杂的方式shinyAce。它对主应用程序和嵌入式 Rmd 文档使用相同的 R 服务器。另请参阅此 SO 问题。AFAIK,这仅适用于knitr::knit2html依赖于过时版本的 RMarkdown 的情况。此外,除非您确保某些 JavaScript 和 CSS 资源正确包含在您的 ui 定义中,否则以这种方式可用的功能render*和数量是有限的。output*

自从我把注意力集中在这个话题上已经过去了很长一段时间,但我当时的印象是,(2)需要做很多工作,并且确实限制了你的选择。

于 2019-04-09T22:53:49.627 回答