如何评估变量并在代码块的回显中使用预定义值

问题描述 投票:0回答:2

我正在使用 R markdown 为学生创建随机练习。 我想在第一个非回显代码块中定义一些变量,并稍后使用这些变量及其在代码块中回显的预定义值,而不是它们的变量名称。

Reprex:在第一个 r markdown 代码块中我定义:

mu <- 100
sd <- 15

在稍后的 r markdown 代码块中,我想使用这些先前定义的变量,并使用已评估的先前定义的变量值回显代码。

pnorm(90, mean = mu, sd = sd)

因此,我希望将 knitted 文档中的上述代码块回显为:
pnorm(90, 均值 = 100, 标准差 = 15)
## 0.2524925

但它回响为:
pnorm(90, 均值 = mu, sd = sd)
## 0.2524925

我已经尝试在代码块中使用 get(mu) 或 eval(mu) 等函数。
但这只会导致错误或显示正确的结果值,但 echo 是实际代码:
pnorm(90, 均值 = eval(mu), sd = 15)
## 0.2524925

r-markdown
2个回答
0
投票

您可以通过在块选项中指定

code
参数来完成此操作。您可以使用
substitute()
将值放入代码中,然后
knitr
将该代码放入块中。

例如,

---
title: "Untitled"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
mu <- 100
sd <- 15
thecode <- substitute(pnorm(90, mean = mu1, sd = sd1),
                      list(mu1 = mu, sd1 = sd))
```

```{r code = thecode}
```

一些注意事项:

  • 您不需要更改变量名称,我这样做只是为了区分您正在修改的表达式中的标记(
    mu1
    sd1
    )和您放入其中的值(
    mu
    sd
    )。
  • 我使用的
    knitr
    格式要求您将整个块选项列表放在一行上。这就是为什么我将代码存储在
    thecode
    中。如果您有一小段代码,可以将表达式
    substitute(...)
    放入 直接进入块头。还有一种较新的格式,其中块选项位于单独的行上,并带有
    #|
    前缀。我用的不多。
  • R Markdown 允许您在生成文档时指定参数,无需在文档中硬编码 100 和 15。请参阅 https://rmarkdown.rstudio.com/lesson-6.html .

0
投票

再次感谢 user2554330 告诉我有关 Replace() 函数和“code”块选项的信息。 他提出的解决方案很有魅力。

为了便于实现,我决定使用直接在代码块中调用的 replacement() 函数来重写它,如下所示:

r markdown_code_chunk, echo = FALSE
substitute(pnorm(90, mean = mu1, sd = sd1), list(mu1 = mu, sd1 = sd))
pnorm(30, mu, sd)

这最终导致以下内容包含在 Markdown 文档中:

## pnorm(90, mean = 100, sd = 15)
## [1] 0.2524925
© www.soinside.com 2019 - 2024. All rights reserved.