Knitr:spin - как добавить текст, не добавляя # вручную в каждой строке?

Насколько я понимаю, knitr:spin позволяет мне работать над моим простым, ванильным, обычным старым хорошим R-скриптом, сохраняя при этом возможность генерировать полный документ, который понимает синтаксис уценки. (см. https://yihui.name/knitr/demo/stitch/)

Действительно, функция rmarkdown в Rstudio, хотя и очень удобная, на самом деле доставляет много хлопот, потому что

  • Мне нужно продублировать свой код и разбить его на куски, что очень скучно и неэффективно, так как трудно отслеживать изменения кода.
  • Кроме того, rmarkdown не может прочитать мою текущую рабочую область. Это как-то удивительно, но так оно и есть.

В целом это очень ограничивает... См. здесь соответствующее обсуждение Есть ли способ вязать Markdown прямо из вашего рабочего пространства с помощью RStudio?.

Как обсуждалось здесь (http://deanattali.com/2015/03/24/knitrs-best-hidden-gem-spin/), spin кажется решением.

Действительно, синтаксис knitr:spin выглядит следующим образом:

#' This is a special R script which can be used to generate a report. You can
#' write normal text in roxygen comments.
#'
#' First we set up some options (you do not have to do this):

#+ setup, include=FALSE
library(knitr)

на обычном рабочем месте!

НО обратите внимание, что каждой строке текста предшествует #'.

Моя проблема в том, что очень неэффективно добавлять #' после каждой строки текста. Есть ли способ сделать это автоматически?

Скажем, я выделяю целый кусок текста, а rstudio добавляет это #' в каждую строку? Может быть, в том же духе, что и комментирование целого куска кода?

Я что-то пропустил?

Спасибо!


person ℕʘʘḆḽḘ    schedule 08.01.2017    source источник
comment
Как насчет замены каждого хэша хешем и апострофом в выбранном фрагменте кода?   -  person kaksat    schedule 09.01.2017
comment
спасибо, чувак, но я просто хочу написать свой текст, не добавляя ничего вручную. это полностью противоречит цели помощи в написании научного документа...   -  person ℕʘʘḆḽḘ    schedule 09.01.2017
comment
Вы говорите о тексте комментария внутри фрагмента кода или обычном тексте вне фрагмента кода? Можете ли вы опубликовать образец вашего полного документа rmarkdown?   -  person eipi10    schedule 09.01.2017
comment
Я имею в виду обычный текст вне фрагмента кода. Что-то вроде того, как в этой статье мы делаем это, это и это, и, кстати, это результат, когда мы делаем это, а затем бум, я показываю вывод моего фрагмента кода.   -  person ℕʘʘḆḽḘ    schedule 09.01.2017
comment
Для обычного текста за пределами фрагмента просто введите обычный текст. Решётки не нужны.   -  person eipi10    schedule 09.01.2017
comment
Я не могу заставить его работать library(tidyverse) library(knitr) this is a test this is a test data <- data_frame(c('one', 'two', 'trree')) data   -  person ℕʘʘḆḽḘ    schedule 09.01.2017
comment
Я не могу скомпилировать короткий код R выше. Что мне опять не хватает? Спасибо!   -  person ℕʘʘḆḽḘ    schedule 09.01.2017
comment
Откройте новый документ rmarkdown в RStudio, который включает пример документа. Обратите внимание, как код R выделяется отдельными фрагментами. Допустим, для встроенного кода R, то есть кода R внутри предложения, вы создали значение x ранее в фрагменте кода и хотите использовать его в предложении. Затем вы можете ввести это (без двойных кавычек): И теперь мы видим, что `x` равно `r x`. Всю основную информацию об использовании уценки R можно найти здесь.   -  person eipi10    schedule 09.01.2017
comment
Похоже, он хочет использовать knitr::spin, а не писать rmd.   -  person Jake Kaupp    schedule 09.01.2017
comment
это именно то. извините за путаницу, я обновляю свой вопрос   -  person ℕʘʘḆḽḘ    schedule 09.01.2017
comment
Если вам нужны объекты в вашем скрипте, но вы ненавидите печатать комментарий roxygen, почему бы просто не source указать свой код в начале rmd? Таким образом, вам не нужно беспокоиться о сопоставлении окружения knitr и вашего кода, и вы можете ссылаться на любые объекты, созданные вашим кодом.   -  person Jake Kaupp    schedule 09.01.2017
comment
Привет, @JakeKaupp, ты имеешь в виду, что использование source позволяет мне 1) загрузить мои данные раз и навсегда и 2) создать несколько диаграмм, скомпилировать, изменить некоторые вещи, снова скомпилировать, добавить текст, повторно скомпилировать БЕЗ повторной загрузки всех данных? ??   -  person ℕʘʘḆḽḘ    schedule 09.01.2017
comment
да. Или вы можете просто поместить этот код в кусок rmd, запустить его и получить доступ ко всему.   -  person Jake Kaupp    schedule 09.01.2017
comment
я запутался. Если я помещу это в фрагмент кода, как я могу скомпилировать свой документ без необходимости перезагрузки rstudio? согласно stackoverflow.com/questions/11155182/ rmarkdown нужно снова запустить все это. извините, если я снова не понимаю вашу точку зрения   -  person ℕʘʘḆḽḘ    schedule 09.01.2017
comment
то, что я хочу сделать, это генерировать мой html/pdf/что угодно много раз, когда я его пишу, но без необходимости каждый раз запускать весь код.   -  person ℕʘʘḆḽḘ    schedule 09.01.2017
comment
На самом деле, самый простой способ быстро восстановить результаты, не запуская долго выполняющиеся части, — это использовать функцию кэширования чанков в Knitr. Поищите, повторный просмотр полных документов займет гораздо меньше времени. Это относится либо к spin, либо к knit.   -  person rmflight    schedule 10.01.2017


Ответы (2)


В RStudio v 1.1.28 начало строки с #' приводит к тому, что следующая строка начинается с #', когда я нажимаю Enter в файле *.R на моей машине (Ubuntu Linux 16.04LTS).

Поэтому, пока вы начинаете текстовый блок с ним, он будет продолжаться. Но для ранее существовавших сценариев R, похоже, вам придется использовать find -> replace или написать функцию для изменения требуемого файла, у меня это сработало в очень простом тесте.

comment_replace <- function(in_file, out_file = in_file){
  in_text <- scan(file = in_file, what = character(), sep = "\n")
  out_text <- gsub("^# ", "#' ", in_text)
  cat(out_text, sep = "\n", file = out_file)
}

Я хотел бы отметить, что эта функция не проверяет наличие ранее существовавших #', вы бы хотели это встроить. Я изменил ее, чтобы она не заменяла их слишком сильно, добавляя пробел в регулярном выражении. .

person rmflight    schedule 09.01.2017
comment
Я также хотел бы отметить, что если вы начнете с использованием Rmd, все будет намного проще, и вы можете использовать Ctrl+alt+p для запуска всех предыдущих фрагментов, запуская все фрагменты, чтобы получить поведение, аналогичное rmarkdown::render. - person rmflight; 09.01.2017
comment
Спасибо! один вопрос, который у меня все еще есть, заключается в следующем. скажем, мой первый фрагмент кода загружает все данные, которые мне нужны. Могу ли я впоследствии прокомментировать этот код, чтобы при render моем документе Rstudio использовала только объекты в памяти? - person ℕʘʘḆḽḘ; 09.01.2017
comment
вы можете прокомментировать этот код или использовать eval=FALSE, чтобы он не запускался повторно при следующем рендеринге. - person rmflight; 09.01.2017

В документе RMarkdown вы должны написать что-то вроде этого:

As you can see I have some fancy code below, and text right here.

```{r setup}
# R code here
library(ggplot2)
```

And I have more text here...

Это краткое описание предлагает краткое введение в RMarkdown и функции knitr. Я думаю, вы не совсем понимаете, что такое RMarkdown на самом деле, это документ уценки с добавлением R между ними, а не (как вы сказали) сценарий R с добавлением уценки между ними.


Редактировать: Для тех, кто голосует против, пожалуйста, прочитайте комментарии под этим ... OP не указал, что он использовал spin ранее.

person Aryaman    schedule 08.01.2017
comment
да, спасибо, но это проблема. Rmarkdown не позволяет использовать объекты в памяти, поэтому мне приходится запускать все сразу. Мне не нужен Rmarkdown, я хочу использовать Knitr. - person ℕʘʘḆḽḘ; 09.01.2017
comment
@Noobie О, в этом гораздо больше смысла. Попробуйте yihui.name/knitr/demo/stitch - person Aryaman; 09.01.2017
comment
да, спасибо, я говорю о spin здесь. вы правы yihui.name/knitr/demo/stitch - person ℕʘʘḆḽḘ; 09.01.2017
comment
@Noobie Хммм, я не думаю, что есть способ автоматизировать #', кроме как найти и заменить. Какой текстовый редактор вы используете? Может быть, есть какой-то способ написать расширение для него. - person Aryaman; 09.01.2017
comment
я просто использую Rstudio мой друг - person ℕʘʘḆḽḘ; 09.01.2017
comment
@Noobie Тогда похоже, что найти и заменить - единственный вариант :( - person Aryaman; 09.01.2017
comment
аввв это ужасно - person ℕʘʘḆḽḘ; 09.01.2017
comment
если вы используете rmarkdown::render() и cache=TRUE, вы можете легко комбинировать Knitr и объекты в памяти, а затем просто перерендерить. Возможно, вам следует расширить свой вариант использования в другом сообщении SO, что может дать вам лучшие предложения. - person rmflight; 09.01.2017