2017-03-08 10 views
2

내 Rmarkdown 문서에 data.table을 전달하여 테이블을 정렬하고 상위 5 개의 정렬 된 항목을 인쇄 할 수있게하고 싶습니다."반응성"데이터를 R Markdown에 매개 변수로 전달하는 방법은 무엇입니까?

"Error : x는 data.frame 또는 data.table이어야합니다"라는 메시지가 계속 표시됩니다 (setorderv). 나는 반응이 is.data.table 수표를 뒤엎고 있다고 의심한다.

단순히 데이터 복사본을 Rmd 문서로 전달하는 방법은 무엇입니까? 그리고 반응성 포장지를 제거 하시겠습니까?

다음은 reactivity 및 downloadHandler 주식 예에서 자갈로 묶은 간단한 예입니다. 나는 관찰을 사용하여 제안한 this on SO을 보았습니다. 그러나 이것을 구현하는 방법을 모르겠습니다. 고마워, 이걸 좀 도와 줘.

RMARKDOWN는 - (RMD)에서 dtparams$로 시작되지 않았다 -이 예를 고정 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

--- 
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) 

``` 

을 SOtestreport.Rmd!

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

나는 아직도이 위의 올바른 접근 방식인지에 대한 답을 찾고 (샤이니에 매개 변수를 전달에 응용 프로그램을 RMarkdown합니다).

나는 또한이 답변이 유용도 있다고 다른 사람에게 지적 할

: 나는 또한 만든 https://stackoverflow.com/a/32295811/4606130

  • What's the difference between Reactive Value and Reactive Expression?

  • @NicE에 의해 ReactiveValues의

    • 사용 반응성을 깨기 위해 데이터 세트를 복사하는 것, 즉

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

      RStudio의 또 다른 팁은 내부 뷰어 창을 사용하지 않고 브라우저에서 외부로 실행하는 것입니다. 임시 파일을 저장 한 위치가 수정되었습니다. 아래 이미지의 앱 실행에서 항상 외부 실행을 선택할 수 있습니다.

      RunExternalinRStudio