Как передать реактивные данные в R Markdown в качестве параметра?

Я хочу иметь возможность передать реактивный data.table моему документу Rmarkdown, который будет сортировать таблицу и печатать верхние, скажем, 5 отсортированных записей.

Я продолжаю сталкиваться с «Ошибка: x должен быть data.frame или data.table» в setorderv. Я подозреваю, что реактив нарушает is.data.table проверки.

Как просто передать копию данных в документ Rmd? И удалить оболочку реактивности?

Вот упрощенный пример, собранный из примеров реактивности и стоковых файлов downloadHandler. Я взглянул на это на SO, который предложил используя наблюдение, но я не уверен, как это реализовать. Спасибо, я ценю некоторую помощь в этом.

RMARKDOWN — SOtestreport.Rmd

---
title: "Top in Segment Report"
output: html_document
params:
  n: 5
  dt: NA
  top.field: NA
---


```{r setup, echo = FALSE}
library(data.table)
library(knitr) # for kable

```
Data report as at: `r format(Sys.time(), "%a %b %d %Y %X")`

```{r, echo = FALSE}
table.str <- paste0("Showing Top ", params$n ," tables for these fields: ", 
             params$top.field)

# is this the best way of having dynamic labels?
```
`r table.str`


```{r, echo = FALSE}
# tried this
# test.dt <- copy(dt)

# normally a function GenerateTopTable with limit sort field etc.
setorderv(dt, params$top.field, -1) # -1 is descending. THIS IS WHERE IT CRASHES
out <- dt[1:params$n,]

```


```{r toptable, echo = FALSE}

kable(out, digits = 3)

```

приложение.R

# SO test report
# mini example based on https://shiny.rstudio.com/gallery/reactivity.html

library(shiny)
library(datasets)

server <- function(input, output) {

  datasetInput <- reactive({
    switch(input$dataset,
           "rock" = rock,
           "pressure" = pressure,
           "cars" = cars)
  })

  output$caption <- renderText({
    input$caption
  })

  output$summary <- renderPrint({
    dataset <- datasetInput()
    summary(dataset)
  })

  output$view <- renderTable({
    head(datasetInput(), n = input$obs)
  })


  # PROBLEM BIT WHERE I AM ADDING ON GALLERY EXAMPLE
  # handler from https://stackoverflow.com/questions/37347463/generate-report-with-shiny-app-and
  output$topreport <- downloadHandler(
    filename = "topreport.html",
    content = function(file) {
      # Copy the report file to a temporary directory before processing it, in
      # case we don't have write permissions to the current working dir (which
      # can happen when deployed).
      tempReport <- file.path(tempdir(), "SOtestreport.Rmd")
      file.copy("SOtestreport.Rmd", tempReport, overwrite = TRUE)

      # Set up parameters to pass to Rmd document
      #  TRIED THIS TOO
      #  my.dt <- as.data.table(datasetInput())
      my.dt <- datasetInput()
      my.params <- list(n = input$obs, 
                        dt = my.dt,
                        top.field = names(my.dt)[1])

      rmarkdown::render(tempReport, output_file = file,
                        params = my.params,
                        envir = new.env(parent = globalenv())
      )
    }
  )

person micstr    schedule 08.03.2017    source источник


Ответы (1)


Я исправил этот пример - dt в Rmd не начинался с params$!

setorderv(params$dt, params$top.field, -1) # -1 is descending
out <- params$dt[1:params$n,]

Я все еще ищу ответы на вопрос, является ли это правильным подходом, описанным выше (при передаче параметров в приложениях Shiny для RMarkdown).

Я также хочу указать другим, что эти ответы также были полезны:

Я также использовал копирование набора данных, чтобы сломать реактивность, т.е.

my.dt <- copy(params$dt)
#do this before passing into render params list

Еще один совет в RStudio — не использовать внутреннюю панель просмотра, а запускать ее извне в браузере. Это исправило проблемы с сохранением временного файла. Вы можете выбрать «Всегда запускать извне» в разделе «Запуск приложения» на изображении ниже:

ВыполнитьExternalinRStudio

person micstr    schedule 08.03.2017