【问题标题】:Use multiple R Markdown files in Shiny tabs在 Shiny 选项卡中使用多个 R Markdown 文件
【发布时间】:2015-04-17 13:04:30
【问题描述】:

我正在构建一个闪亮的应用程序,我想要多个标签集。到目前为止我得到的代码给了我:

shinyUI(navbarPage("OEI Grant",
  tabPanel("Part 1 - Organization",
           tabsetPanel("1.x",
                       tabPanel("1.1"),
                       tabPanel("1.2"),
                       tabPanel("1.3")
                       ))))

我无法弄清楚的部分是如何为每个选项卡(1.1、1.2 等)获取单独的交互式文档(R markdown .Rmd 文件)。

我正在寻找与 includeMarkdown() 函数等效的功能,但要寻找本身包含闪亮应用程序的 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)
  )
```

This RTutor Shiny App 与我在多个选项卡上所做的类似,但从查看它们的代码来看,我认为所有内容都在一个 R 降价文件中提供,并以某种方式解析为不同的部分。

R Markdown 文档讨论了linking multiple pages,但我想要的是内容而不是链接。

唯一的example in the Gallery for Tabsets 展示了如何将 server.R 的输出放入不同的选项卡,而不是单独的 R Markdown 文件。

关于如何做到这一点的任何想法?

【问题讨论】:

  • 也许 Rstudio 的人应该回答这个问题。

标签: r shiny rstudio shiny-server


【解决方案1】:

作为前面答案中提到的方法的替代方法,您可能想尝试此 repo https://github.com/vnijs/shiny-site 中说明的方法。这是一个概念证明,您可以在闪亮的环境中使用 Knitr 渲染 rmarkdown 文件,而无需应用程序将文件分解为多个部分。它通过使用 Shiny 的 renderUI 功能并在 shinyServer 环境中评估 rmarkdown 文件来工作。

【讨论】:

  • 这正是我想要的,我测试了你的代码并且它有效!您甚至可以将整个 App 本身嵌入到另一个 R markdown 文档中,使其非常灵活。
  • 很高兴它也对您有用。将应用程序嵌入到另一个 Rmarkdown 文件 @av1 中的好主意。您是否将应用程序放在 GitHub 或类似网站上?
  • 我最终使用了一个 R 降价文件并(在某种程度上)通过将目录链接到不同部分来解决导航问题(请参阅应用程序 here)。如果我不得不再做一次,我想我会实施您的解决方案并将每个主要部分放在它自己的选项卡中。如果我以这种方式重新组织它,我会更新。
【解决方案2】:

这可能没什么帮助,因为它没有回答关键问题,即如何将交互式 Markdown 文件(带有闪亮)放入选项卡中。

RTutor 解析一个 Rmd 解决方案文件,将其分成不同的部分,然后使用大量动态 UI,其中填充了通过编织这些部分创建的 html 输出。

要将变量 txt 中的 markdown 源动态结合为 html,您可以使用:

ktxt = knit(text=txt) html= markdownToHTML(text=ktxt, fragment.only=TRUE)

您可以通过相应的渲染函数将创建的html 分配给htmlOutputuiOutput(参见http://shiny.rstudio.com/articles/dynamic-ui.html)。 (RTutor 使用了 shinyEvents 包中的 setUI 函数来渲染 html,但这只是一个包装器。)

我不知道是否可以渲染具有以这种方式嵌套的闪亮应用程序的 Rmd 代码。在 RTutor 中,交互性由实时构建所有小部件的 RTutor 包执行。底层 Rmd 文件中没有闪亮的代码。

【讨论】:

    【解决方案3】:

    我目前的做法类似于@sebastian-kranz 的评论。我将 Rmd 文件分解成块,因为从闪亮的应用程序 (AFAIK) 中调用降价文档时交互式元素将不起作用。下面的例子。如果您可以创建一个适用于运行时的动态 Markdown 文档,那就太好了:shiny,然后从 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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-21
      • 2017-04-06
      • 2020-04-11
      • 1970-01-01
      • 2017-03-11
      • 2016-10-27
      相关资源
      最近更新 更多