我正在尝试将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 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
文件中为闪亮的应用程序进行渲染。这可能吗?
答案 0 :(得分: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 :(得分:0)
通常来说,有两种方法可以将交互式RMarkdown文档嵌入闪亮的应用程序中。
(1)通常的方法(由@Phil提出)是让一台R服务器运行嵌入式教程,另一台R服务器运行应用程序。可以通过先通过shinyapps.io或shiny-server部署教程,然后再使用iframe来存档。或者,您可以使用callr::r_bg()
在本地后台进程中运行教程。无论如何,这将使Rmd文档无法与闪亮的应用程序进行交互。如果您的用例可行,我建议您使用此选项。
(2) shinyAce
软件包的维护者在here中概述了一种更为复杂的方法。它对主应用程序和嵌入式Rmd文档使用相同的R服务器。另请参见this SO question。 AFAIK,这仅适用于knitr::knit2html
,后者依赖于RMarkdown的过时版本。另外,除非确保在ui定义中正确包含某些JavaScript和CSS资源,否则以这种方式可用的render*
和output*
函数的数量是有限的。
自从我围绕这个话题开始已经过去了很长时间,但当时的印象是(2)需要大量工作,并且确实限制了您的选择。