【问题标题】:How do I explain a complicated function in Rmarkdown?如何解释 Rmarkdown 中的复杂函数?
【发布时间】:2019-11-30 05:03:55
【问题描述】:

我有一个有点复杂的 R 函数(不同部分指的是我想解释的各种方程。) 我想使用 R Markdown 编写代码,但我需要能够解释文档中函数的不同部分。有点像文学编程。

我想知道是否可以将函数定义拆分为不同的代码块,或者在函数定义中插入markdown cmets?

我希望最终结果看起来像这样:

complicated = function(x) {

我在示例中使用 x^2,所以它是数学,但很短。这是实际的 R 代码:

  x^2
}

这不起作用:

``` {r}
complicated = function(x) {
```
explain the function with some math $x^$.
``` {r}
 x^2
}
```

以下实际上确实工作:

``` {r chunk1, echo=FALSE}
complicated=function(x) {
  x^2
}
```

``` {r chunk1, echo=1:2, eval=F}
```
In the complicated function I use x^2 as an example.

虽然有点棘手,因为如果函数中的行发生变化,我必须重新编辑所有内容。同样在 Rmd 文件中,您实际上看不到 cmets 描述的代码。

注意:

也许有可能以某种方式将相关块写入文件而不进行评估,然后读取文件?我还没想出办法……

【问题讨论】:

  • {r, eval = T, echo = F} 应该可以工作,这将打印块中的代码,但不会运行它。
  • 谢谢。然后我是否必须第二次包含该函数,它在哪里被评估但不包含在输出中?我更喜欢只拥有一次,但如果这不可能,我可以将它包含在 cmets 中并且不进行评估,然后运行一次。
  • 为什么不让它同时评估和打印呢?我不明白你的用例。
  • 我不想同时评估和打印它,因为我想在中间插入一个格式化的注释。 (请参阅上面我编辑的问题)。但我可以评估和打印非封闭函数。
  • 您不能将一个函数拆分为多个块。在一个块中定义函数,在后续块中逐行描述。

标签: r r-markdown


【解决方案1】:

这是一种方法,虽然我承认这有点像 hack。

---
title: "Split Function"
output: html_document
---

```{r funcdef}
myfunc <- function(x) {
  x <- x + 1
  x <- x * 2
  return(x)
}
```

```{r funcdef1, echo = FALSE, eval = FALSE, include = FALSE}
x <- NULL
  x <- x + 1
  x <- x * 2
  return(x)
```

First line:

```{r funcdef1, echo=2, eval = FALSE}
```

Now the last two:

```{r funcdef1, echo=3:4, eval = FALSE}
```

Done!

解释:

  • 第一个块funcdef是完整的函数定义,如果我们想使用它就需要它;
  • 第二个块包括第一行(我不回显,用echo=-1 省略),这样其他人就不会用'x' not found 出错(如果我不这样做,甚至评估或包括);请注意,它使用相同的块名称并且其中没有任何内容
  • 第三块也一样
  • 我必须在没有function 标头和大括号的情况下拆分函数主体的原因是echo= 使用数字允许我们对包含哪些表达式 进行子集化,而不是lines ...并且函数声明是一个表达式

我不太喜欢这个的两点:

  1. 它要求您将函数主体包含两次,因此维护的开销比所需的要多;
  2. 它认为x 正在被使用,而我真正想要的只是引用代码。

坦率地说,这可能并不比在每个后续块中包含代码部分好多少(并设置eval=FALSE)。

【讨论】:

    【解决方案2】:

    我找到了这个问题的一个很好的答案,虽然它看起来有点像 knitr bug。我希望它不会得到修复。事实证明,对块的引用在 Rmd 中就像在 Rnw 中一样工作。你只需要使用&lt;&lt;chunk name&gt;&gt; 来引用一个块。

    所以,这就是答案:

    ```{r Xsquare, eval=F}
    x^2
    ```
    We just need to take x and raise it to the second power: $x^2$.
    
    Now let us put it together:
    
    ```{r complicated, eval=T}
    complicated = function(x) {
       <<Xsquare>>
    }
    ```
    

    简单吧?

    在 Rstudio 中,它仅在我们将所有内容组合在一起时才有效,而不是在运行单个块时有效。几乎是有道理的。

    要解决此问题,请在控制台中运行以下命令:knit("filename.Rmd")

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-17
      • 2019-08-14
      • 2021-06-10
      • 1970-01-01
      • 2017-08-01
      • 2017-11-22
      相关资源
      最近更新 更多