Использование разметки внутри фрагментов кода для определения больших функций - PullRequest
2 голосов
/ 11 марта 2020

Я хотел бы использовать R Markdown для большого проекта. В проекте используется ряд очень больших самоопределяемых функций. Поэтому я хотел бы использовать уценку, чтобы прокомментировать некоторые части функции.

```{r}
my_function <- function(x,y){
  test <- x + seq(1,10)
```

Затем я хотел бы использовать Markdown для описания второй части функции

```{r}
  output <- test + y
  return(output)
}
```

И затем я хотел бы применить функцию

```{r}
my_function(1,2)
```

Конечно, я понимаю, что мог бы просто использовать символ #, чтобы добавить комментарий, но это не так хорошо, как уценка. Это актуально, например, для больших блестящих серверных функций или чего-то в этом роде. Есть идеи, как я мог это сделать?

1 Ответ

6 голосов
/ 11 марта 2020

В R-уценке вы не можете определять объекты (например, функции) по частям (afaict). Одной из альтернатив будет невидимое определение функции, а затем использование неисполняемых фрагментов кода для обсуждения частей. Но мне не нравится эта альтернатива, так как она удваивает усилия и увеличивает вероятность наличия различных функций.

Одна альтернатива - определить четкие маркеры в функции, захватить тело функции и разделить по этим маркерам. Попробуйте это:

---
title: test markdown
---

```{r echo = FALSE, include = FALSE}
my_function <- function(x,y){
  test <- x + seq(1,10) ###BREAK###
  # normal comment
  output <- test + y    ###BREAK###
  return(output)
}
my_function_body <- strsplit(
  paste(head(capture.output(print.function(my_function)), n = -1), collapse = "\n"),
  "###BREAK###[\n\r]*")[[1]]
```

```{r echo = FALSE, include = TRUE, comment = ''}
cat(my_function_body[[1]])
```

Then I would like to use Markdown to describe the second part of the function


```{r echo = FALSE, include = TRUE, comment = ''}
cat(my_function_body[[2]])
```

Now the third/last part of the function


```{r echo = FALSE, include = TRUE, comment = ''}
cat(my_function_body[[3]])
```

And then I would like to apply the function

```{r}
my_function(1,2)
```

And the whole of the function (excluding the markers):

```{r echo = FALSE, include = TRUE, comment = ''}
cat(
  gsub("###BREAK###", "",
       paste(head(capture.output(print.function(my_function)), n = -1), collapse = "\n"))
)
```

Это выглядит как:

rmarkdown rendered

...