2015-10-29 3 views
1

Я работаю над документом RMarkdown, который использует объекты, которые занимают много времени для создания и преобразования. Синтаксис похож на это:Избегайте повторного создания объектов в документе RMarkdown через оператор if

--- 
title: "Example" 
author: "Test" 
date: "October 29, 2015" 
output: pdf_document 
--- 

Example 

```{r} 
test_exc <- "NO" 
if(exists("some_dta") == FALSE) { 
    set.seed(1) 
    # This data is big and messy to transform and I don't want to do it twice 
    some_dta <- data.frame(speed=runif(n = 1000),nonsense=runif(1000)) 
    test_exc <- "YES" 
} 
``` 

You can also embed plots, for example: 

```{r, echo=FALSE} 
plot(some_dta) 
``` 

Was the code executed: `r test_exc` 

Как указывается в коде выше, я хотел бы, чтобы избежать повторного выполнения кода if(exists("some_dta") == FALSE) { ... }. Как показано в коде ниже кода внутри цикла выполняется:

Markdown results

Я хотел бы знать, если есть способ заставить RStudio механизм создания уценки, чтобы понять, что я эти объекты существуют где-то и есть не нужно создавать их снова.

ответ

2

Вы можете использовать кэширование, как описано в the online knitr documentation, например:

--- 
title: "Example" 
author: "Test" 
date: "October 29, 2015" 
output: pdf_document 
--- 

Example 

```{r chunk1,cache=TRUE} 
    set.seed(1) 
    # This data is big and messy to transform and I don't want to do it twice 
    some_dta <- data.frame(speed=runif(n = 1000),nonsense=runif(1000)) 
} 
``` 
2

Вы можете сохранить ваши данные в .rds объекта, а затем запустить проверку, чтобы убедиться, что файл существует

```{r} 
if(!file.exists("some_dta.rds")) { 
    set.seed(1) 
    # This data is big and messy to transform and I don't want to do it twice 
    some_dta <- data.frame(speed=runif(n = 1000),nonsense=runif(1000)) 
    saveRDS(some_dta, file='some_dta.rds') 
} else { 
    some_dta <- readRDS('some_dta.rds') 
} 
``` 
+0

Благодарим за проявленный интерес. Я использую '.rds' файлы много. В идеале, я бы не хотел создавать много из них, также я связываюсь с сетевыми ресурсами в этом файле, поэтому толчок массивных файлов через сеть не помогает скорости. – Konrad

+1

@Konrad Итак, вы хотите вытаскивать объекты, хранящиеся в памяти, из сеанса консоли? [См. Этот вопрос] (http://stackoverflow.com/questions/11155182/is-there-a-way-to-knitr-markdown-straight-out-of-your-workspace-using-rstudio). – DunderChief

+0

Чтение объектов, уже загруженных в глобальную среду, было бы идеальным решением. Затем я мог бы легко их модифицировать и избегать повторного создания при компиляции документа. Вариант кеша будет работать, но возможность загрузки из глобальной среды будет идеальной. – Konrad

Смежные вопросы