2017-03-08 40 views
2

我希望能够将被动data.table传递给我的Rmarkdown文档,该文档将对表格进行排序并打印排名最高的5个条目。如何将“反应性”数据转换为R Markdown作为参数?

我继续碰到“Error:x must be a data.frame or data.table”at setorderv。我怀疑被动反应会扰乱is.data.table检查。

如何简单地将数据的副本传递给Rmd文档?并删除反应包装?

这里是一个简单的例子,从反应性和downloadHandler库存的例子拼凑而成。我采取了看this on 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) 

``` 

app.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()) 
    ) 
    } 
) 

回答

3

我解决了这个例子 - 在RMD dt不是用params$开头!

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

我仍然在寻找这是否是上述正确的做法答案(在闪亮的参数传递到RMarkdown应用程序)。

我也想指出别人,这些答案也有用:

我也做使用复制数据集来破坏反应性,即

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

RStudio的另一个提示是不使用内部查看器窗格,而是在浏览器中运行外部。这固定在临时文件保存问题的地方。您可以选择始终运行下面的图像中的运行应用程序:

RunExternalinRStudio