Как автоматически отобразить файл rmarkdown (.Rmd) при загрузке страницы? - PullRequest
1 голос
/ 04 февраля 2020

У меня есть два файла 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)

1 Ответ

1 голос
/ 04 февраля 2020

Я бы использовал 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)
...