【问题标题】:How to automatically render an rmarkdown (.Rmd) file upon page load?如何在页面加载时自动呈现 rmarkdown (.Rmd) 文件?
【发布时间】:2020-05-19 18:49:10
【问题描述】:

我有两个 rmarkdown 文件。 Rmd #1:

---
title: "RMD1"
output: html_document
runtime: shiny
---

<style type="text/css">

h1.title {

text-align: center;
color: DarkBlue;
font-size: 38px;

}
</style>


```{r eruptions, echo=FALSE}
shinyApp(
  ui = fluidPage(
    inputPanel(
      selectInput("n_breaks", label = "Number of bins:",
                  choices = c(10, 20, 35, 50), selected = 20),

      sliderInput("bw_adjust", label = "Bandwidth adjustment:",
                  min = 0.2, max = 2, value = 1, step = 0.2)
    ),
    plotOutput("eruptionsPlot")),

    server = function(input, output) {
      output$eruptionsPlot = renderPlot({
      hist(faithful$eruptions, probability = TRUE, breaks = as.numeric(input$n_breaks),
           xlab = "Duration (minutes)", main = "Geyser eruption duration")

      dens <- density(faithful$eruptions, adjust = input$bw_adjust)
      lines(dens, col = "blue")
    })
    },
    options = list(height = "600px")
)
```

Rmd #2:

---
title: "RMD2"
output: html_document
runtime: shiny
---

<style type="text/css">

h1.title {

text-align: center;
color: DarkBlue;
font-size: 38px;

}
</style>

我将 RMD1 和 RMD2 绑定到下面闪亮应用代码中的两个操作按钮。我的问题:如何在页面加载时自动呈现 RMD1(就像自动点击操作按钮一样)?

额外问题:当我第一次运行应用程序时,我需要单击一个操作按钮两次来呈现 rmarkdown 文件。我通过在下面添加一行来解决这个问题,该行未连接到任何操作按钮并输出 rmarkdown 文件。不知道为什么会这样,或者是否有更合乎逻辑/更优雅的解决方案。

library(shiny)
library(shinyWidgets)

rmd_list <- list("rmd1.Rmd", "rmd2.Rmd")

ui <- shinyUI(fluidPage(
  shinyWidgets::panel(
    fluidRow(
      column(12, align="center",
             actionButton("rmd1", "RMD1"),
             actionButton("rmd2", "RMD2")
      )
    )),
  ,uiOutput("uioutput")

))

# Define server logic ----
server <- function(input, output, session) {

#So that I dont need to double click on an action button to render any rmarkdown. No idea why this happens, but this is my solution to the "double click" problem.
  output$uioutput <- renderUI({
    withMathJax(includeHTML(rmarkdown::render(rmd_list[[1]])))

  observeEvent(input$rmd1, {
    output$uioutput <- renderUI({
      withMathJax(includeHTML(rmarkdown::render(rmd_list[[1]])))
    })
  })

  observeEvent(input$rmd2, {
    output$uioutput <- renderUI({
      withMathJax(includeHTML(rmarkdown::render(rmd_list[[2]])))
    })
  })  

}

# Run the app ----
shinyApp(ui = ui, server = server)

【问题讨论】:

    标签: r shiny r-markdown


    【解决方案1】:

    我会使用reactiveVal 来存储选择和显示的.Rmd。通过将初始值设置为 1,它将在加载时显示您的 rmd1.Rmd 文件。

    您只想要一个output$uioutput,并且通常会尽量避开观察者。在这种情况下,output 将呈现 reactiveVal 设置为(1 或 2)的任何内容。

    您的 observeEvent 按钮只会将您的 reactiveVal 更改为 1 或 2。

    library(shiny)
    library(shinyWidgets)
    
    rmd_list <- list("rmd1.Rmd", "rmd2.Rmd")
    
    ui <- shinyUI(fluidPage(
      shinyWidgets::panel(
        fluidRow(
          column(12, align="center",
                 actionButton("rmd1", "RMD1"),
                 actionButton("rmd2", "RMD2")
          )
        )),
      uiOutput("uioutput")
    ))
    
    # Define server logic ----
    server <- function(input, output, session) {
    
      rv <- reactiveVal(1)
    
      output$uioutput <- renderUI({
        withMathJax(includeHTML(rmarkdown::render(rmd_list[[rv()]])))
      })
    
      observeEvent(input$rmd1, { rv(1) })
    
      observeEvent(input$rmd2, { rv(2) })
    
    }
    
    # Run the app ----
    shinyApp(ui = ui, server = server)
    

    【讨论】:

    • 不幸的是,这个答案似乎不起作用。应用程序加载,但在我按下按钮 rmd2 之前什么都看不到。 Rmd1 仅在 我按下 rmd2 之后才开始工作。
    • Ben,原来我的包没有完全更新!您的解决方案有效!谢谢。
    猜你喜欢
    • 2019-12-27
    • 2012-11-14
    • 2013-06-03
    • 2013-05-31
    • 2020-02-14
    • 2021-12-11
    • 1970-01-01
    • 2020-03-31
    • 1970-01-01
    相关资源
    最近更新 更多