Заставить knitr запустить сценарий r: использовать read_chunk или исходный код?

Я использую R версии 2.15.3 с RStudio версии 0.97.312. У меня есть один скрипт, который читает мои данные из разных источников и создает несколько data.tables. Затем у меня есть еще один сценарий r, который использует данные data.tables, созданные в первом сценарии. Я хотел превратить второй сценарий в сценарий R markdown, чтобы результаты анализа можно было вывести в виде отчета.

Я не знаю цели read_chunk, в отличие от source. Мой read_chunk не работает, но source работает. В любом случае я не могу видеть объекты на панели рабочего пространства RStudio.

Объясните, пожалуйста, разницу между read_chunk и source? Зачем мне использовать то или другое? Почему мой .Rmd скрипт не работает

Вот смехотворно упрощенный образец

Это не работает. Я получаю следующее сообщение

Ошибка: объект "z" не найден

Два простых файла ...

проверка исходников на rmd.R

x <- 1:10
y <- 3:4
z <- x*y  

источник тестирования.Rmd

Can I run another script from Rmd
========================================================

Testing if I can run "test of source to rmd.R"

```{r first part}
require(knitr)
read_chunk("test of source to rmd.R")
a <- z-1000
a
```

The above worked only if I replaced "read_chunk" with "source". I 
can use the vectors outside of the code chunk as in inline usage. 
So here I will tell you that the first number is `r a[1]`. The most 
interesting thing is that I cannot see the variables in RStudio 
workspace but it must be there somewhere.

person Farrel    schedule 19.03.2013    source источник


Ответы (3)


read_chunk() читает только исходный код (для будущих ссылок); он не оценивает код, как source(). Назначение read_chunk() было объяснено на этой странице, а также в руководство.

person Yihui Xie    schedule 19.03.2013
comment
Я прочитал «Экстернализация кода». Может быть, из-за того, что я не настоящий программист, я сначала не осознал разницу между чтением и оценкой. Зачем читать предыдущий код, но не оценивать его? Я вижу, что для того, что я хочу сделать, мне явно нужно использовать source. - person Farrel; 20.03.2013
comment
Я также узнал, что каждый запуск knitr является отдельным сеансом и не может использовать объекты, которые присутствовали в моем сеансе RStudio. Итак, пока я пишу (составляю, разрабатываю) свой .Rmd-скрипт, мне нужно начать с простого извлечения файла изображения .Rdata, созданного исходным исходным .r-файлом. Если бы мне пришлось многократно запускать свой .Rmd во время разработки, чтобы посмотреть, как у меня дела, мне пришлось бы ждать 10-20 секунд каждый раз, когда выполняется строка source. Как только у меня все заработало, я мог вернуться к использованию source, чтобы в будущих прогонах использовались самые свежие данные. - person Farrel; 20.03.2013
comment
1. сохраните фрагменты кода для использования в будущем; 2. если вам нужна скорость, используйте опцию chunk cache=TRUE. Две ссылки в моем ответе - моя лучшая попытка объяснения. Если вы прочитали их и все еще не поняли read_chunk(), я бы порекомендовал вам оставить это позади - вам, вероятно, это действительно не нужно. - person Yihui Xie; 20.03.2013
comment
А как насчет дочерних документов? служит ли это другой цели? звучит очень похоже. Идея похожа на команду \ input {} или \ include {} в LaTeX для управления большим документом меньшими частями. от http://yihui.name/knitr/demo/child/ по сравнению с. Вам не нужно вводить код R во входной документ; с помощью knitr вы можете отделить входной документ с помощью сценария R от http://yihui.name/knitr/demo/externalization/ Я был бы признателен за краткое описание основных различий, если таковые имеются. +1 - person PatrickT; 19.12.2014
comment
@Yihui source, похоже, не работает - меня кричат ​​за включение символов < в мой код ради html. Что мне делать вместо этого? - person theforestecologist; 24.04.2017

Нет возможности запустить блок в интерактивном режиме из knitr AFAIK. Однако это можно легко сделать с помощью чего-то вроде:

#' Run a previously loaded chunk interactively
#'
#' Takes labeled code loaded with load_chunk and runs it in the /global/ envir (unless otherwise specified)
#'
#' @param chunkName The name of the chunk as a character string
#' @param envir The environment in which the chunk is to be evaluated 
run_chunk <- function(chunkName,envir=.GlobalEnv) {
    chunkName <- unlist(lapply(as.list(substitute(.(chunkName)))[-1], as.character))    
    eval(parse(text=knitr:::knit_code$get(chunkName)),envir=envir) 
} 
NULL
person russellpierce    schedule 26.01.2015

На случай, если это поможет кому-то еще, я обнаружил, что использование read_chunk() для чтения сценария без оценки может быть полезно двумя способами. Во-первых, у вас может быть сценарий с множеством фрагментов, и вам нужно контролировать, какие из них запускаются и где (например, график или таблица в определенном месте). Я использую source, когда хочу запустить все в сценарии (например, в начале документа для загрузки стандартного набора пакетов или пользовательских функций). Я начал использовать read_chunk в начале документа, чтобы загружать сценарии, а затем выборочно запускать нужные мне фрагменты там, где они мне нужны.

Во-вторых, если вы работаете со сценарием R напрямую или в интерактивном режиме, вам может потребоваться длинная преамбула кода, который загружает пакеты, данные и т. Д. Такая преамбула, однако, может быть ненужной и медленной, если, например, предыдущие фрагменты кода в в основном документе уже загружены данные.

person Omar Wasow    schedule 05.08.2019