gpt4 book ai didi

r - 使用 "details"HTML 标签切换 block 输出

转载 作者:行者123 更新时间:2023-12-01 13:18:31 24 4
gpt4 key购买 nike

我正在使用 blogdown 写一些教程。出于教学原因,我希望我的学生在看到解决方案之前先思考一下。这是我当前的代码。

原创

---
title: "Toggle Chuck Output Using details Tag"
output: html_document
---

```{r calc, prompt=TRUE, eval=FALSE}
90 + 30
```

<details>
<summary>Toggle output</summary>
```{r, ref.label='calc', echo=FALSE, prompt=TRUE}
```
</details>

这是我的尝试:

为了避免重复编写 HTML 标签,我想我需要定义一个类似于 ...
togglable <- function(label, summary = "Toggle output"){
cat('<details>')
cat(' <summary>', summary, '</summary>', sep = '')

# Code to print output using 'ref.label' should go here.
# The following doesn't work.
knitr::knit_print(knitr:::knit_code$get(label))

cat('</details>')
}

.... 然后替换 <detals>...</details>具有类似于以下的 R 代码块的 block :

用例 1(更好)
```{r usecase1, echo=FALSE, results='asis'}
togglable(label = "calc")
```

我试图让它工作,但徒劳无功。

还有一件事。如果可能的话,我想要这个 togglable()覆盖 block 选项的函数,这样我什至不需要写 echo=FALSE , results='asis' ,因为下面的 block 会更好看。

用例 2(最佳)
```{r usecase2}
togglable(label = "calc")
```

总之,我想问以下问题。
  • 我该如何定义 togglable()函数,使其行为方式与原始 <detals>...</details> 相同堵塞?
  • 该函数是否有可能覆盖调用该函数的 block 的选项(特别是 echoresults)?如果是,如何?
  • 或者,是否有任何其他想法如何在不重复编写 HTML 标签的情况下生成原始代码的结果?

  • 非常感谢你!

    最佳答案

    这可以通过 chunk option ref.label 的组合来完成。 (重复使用 block ),一个 chunk hook (打印 <details> 标签)和 option hook (在显示结果时更改 block 选项。

    ---
    title: "Toggle Chuck Output Using details Tag"
    output: html_document
    ---

    ```{r setup, include=FALSE}
    library(knitr)

    knit_hooks$set(showDetails = function(before, options, envir) {
    if (before) {
    return("<details>\n")
    } else {
    return("\n</details>")
    }
    })

    opts_hooks$set(showDetails = function(options) {
    if(options$showDetails) {
    options$echo = FALSE
    options$results = "asis"
    }
    return(options)
    })
    ```

    ```{r calc, prompt=TRUE, eval=FALSE}
    90 + 30
    ```


    ```{r, ref.label="calc", showDetails = TRUE}
    ```
    这个怎么运作:
  • block 钩子(Hook)在选项 showDetails 的每个 block 之前和之后执行不是 NULL .它打印(返回)相应的 HTML。
  • 选项钩子(Hook)为那里的每个 block 调整其他选项( echoresults )showDetailsTRUE .

  • 通过全局设置 calc 的选项可以进一步改进代码。 block ,这样您就不必为所有其他“仅显示代码” block 重复它们:添加 opts_chunk$set(prompt = TRUE, eval = FALSE)到设置 block 和 options$eval = TRUE到选项 Hook 。
    此外,如果你想要 <detail>使用 ref.label 时默认标记, 你可以使用 ref.label作为选项 Hook :
    ```{r setup, include=FALSE}
    library(knitr)

    opts_chunk$set(prompt = TRUE, eval = FALSE)

    knit_hooks$set(showDetails = function(before, options, envir) {
    if (before) {
    return("<details>\n")
    } else {
    return("\n</details>")
    }
    })

    opts_hooks$set(ref.label = function(options) {
    options$echo = FALSE
    options$results = "asis"
    options$eval = TRUE
    options$showDetails = TRUE

    return(options)
    })
    ```

    ```{r calc}
    90 + 30
    ```


    ```{r, ref.label="calc"}
    ```

    关于r - 使用 "details"HTML 标签切换 block 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52323987/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com