在Shiny标签中使用多个R Markdown文件

4
我正在构建一个Shiny应用,希望有多个选项卡集。到目前为止,我已经得到了以下代码:
shinyUI(navbarPage("OEI Grant",
  tabPanel("Part 1 - Organization",
           tabsetPanel("1.x",
                       tabPanel("1.1"),
                       tabPanel("1.2"),
                       tabPanel("1.3")
                       ))))

Current Layout

我无法理解的是如何为每个选项卡(1.1,1.2等)获取单独的交互式文档(R Markdown .Rmd文件)。
我正在寻找与includeMarkdown()函数相当的东西,但是针对的是包含Shiny应用程序的R Markdown文件。
例如,在1.1中,我可能希望显示以下简单.Rmd文件的输出:
---
runtime: shiny
---
# Data visualization

Example visualization

```{r read-in-data, echo = FALSE, eval=TRUE, message=TRUE}
library(ggplot2)
data(OrchardSprays) # Use this data                                                                                                                                                                            
head(OrchardSprays)
```

## Histogram

We can also look at this data in an interactive histogram.

```{r histogram, echo = FALSE, eval=TRUE}
shinyAppDir(
    "histogram/",
    options=list(width="100%", height=450)
  )
```

这个RTutor Shiny App与我尝试实现的多个选项卡类似,但从他们的代码来看,我认为所有内容都提供在一个R Markdown文件中,并以某种方式解析成不同的部分。

R Markdown文档讨论了链接多个页面,但我想要内容而不是链接。

唯一的选项卡图库示例展示了如何将server.R的输出放入不同的选项卡中,但没有单独的R Markdown文件。

有什么好的想法吗?


也许应该有来自Rstudio的人来回答这个问题。 - highBandWidth
3个回答

6
作为早期答案中提到方法的替代方案,您可能想尝试在此存储库中说明的方法https://github.com/vnijs/shiny-site。这是一个概念验证,您可以使用Shiny的renderUI功能并在shinyServer环境中评估rmarkdown文件,而无需将应用程序拆分成部分来渲染rmarkdown文件。请注意,该方法保留了html标签。

这正是我一直在寻找的,我测试了您的代码,它可以运行!您甚至可以将整个应用程序嵌入到另一个 R markdown 文档中,这使其非常灵活。 - Stefan Avey
很高兴它也对你有用。在另一个Rmarkdown文件中嵌入应用程序的想法很好,@av1。你会把你的应用程序放在GitHub或类似的平台上吗? - Vincent
我最终使用了一个单一的R Markdown文件,并通过在目录中添加链接到不同部分(请参见应用程序此处)来解决导航问题。如果我再次这样做,我认为我会实现您的解决方案,并将每个主要部分放在自己的选项卡中。如果我按照这种方式重新组织它,我会进行更新。 - Stefan Avey

2

我的当前方法与@sebastian-kranz的评论类似。我将Rmd文件拆分成块,因为在从shiny应用程序中调用markdown文档时交互元素无法工作(据我所知)。下面是示例。如果您能创建一个可以与运行时:shiny一起使用的动态markdown文档,并从Shiny应用程序中调用它,那将非常好。

output$mini_case_1 <- renderUI({
  tagList(
    rmarkdown::render("./cases/case1/01_test.Rmd", html_document()),
    inclRmd("./cases/case1/01_mini_case_1.Rmd"),
    sliderInput("price_coeff", label = "Adjust price sensitivity:", min = -20, max = 0, value = -6, step = 1),
    plotOutput("mc1_demand"),
    inclRmd("./cases/case1/02_mini_case_1.Rmd"),
    sliderInput("price", label = "Adjust price:", min = 0, max = 12, value = 3, step = 1),
    plotOutput("mc1_profit"),
    inclRmd("./cases/case1/03_mini_case_1.Rmd")
  )
})

inclRmd <- function(path) {
  paste(readLines(path, warn = FALSE), collapse = '\n') %>%
  knitr::knit2html(text = ., fragment.only = TRUE, options = "",
                   stylesheet=file.path(r_path,"../www/empty.css")) %>%
    gsub("&lt;!--/html_preserve--&gt;","",.) %>%
    gsub("&lt;!--html_preserve--&gt;","",.) %>%
    HTML %>%
    withMathJax
}

2
可能这并没有什么帮助,因为它没有回答关键问题,即如何将交互式的markdown文件(带有shiny)放入选项卡中。
RTutor解析一个Rmd解决方案文件,将其分成不同的部分,然后使用许多动态UI,这些UI由通过编织这些部分创建的html输出填充。
要将变量txt中的markdown源动态编织为html,可以使用:
ktxt = knit(text = txt) html = markdownToHTML(text = ktxt, fragment.only = TRUE)
您可以通过相应的渲染函数(请参阅http://shiny.rstudio.com/articles/dynamic-ui.html)将创建的html分配给htmlOutputuiOutput。(RTutor使用shinyEvents包中的setUI函数呈现html,但那只是一个包装器。)
我不知道是否可能以这种方式嵌套带有shiny应用程序的Rmd代码进行呈现。在RTutor中,交互性是由RTutor包执行的,该包在运行时构建所有小部件。底层的Rmd文件中没有任何shiny代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接