有条件地包括html表与r对象在markdown?



我正在使用Rmarkdown自动生成一系列动态报告。大多数报告包括一个关于单个问题的表格,尽管有几个案例有多个问题(见下文)。因为报表是动态生成的,所以html表的内容依赖于r对象。

我如何设置我的标记下调html有条件地评估并在适当的时候显示第二个表(通过"eval = has_two_qs"参数)之类的)?我试过使用"asis"更改块选项。或"echo",但它不会触发r对象(例如,r q2_text按字面意思显示-而不是参数中指定的实际q2_text)。我还尝试过通过在div中包含data-show-if来直接显示html表的部分,但这也不能让我达到我想要的地方。

示例(按预期工作,所有报告都有Q1):

<table border=1 frame=hsides rules=rows>  
<tr>
<td>Q1</td>
<td>`r q1_text`</td>
</tr>
<tr>
<td>Q1 key</td>
<td>`r q1_answers`</td>
</tr>
<tr>
<td> Q1 percent correct</td>
<td>`r q1_pct_correct`</td>
</tr>
</table>

我遇到困难的部分(引号中有失败的选项,因为我不知道如何通过markdown显示它们):

# ```(asis, echo = has_two_qs) # 
<table border=1 frame=hsides rules=rows>  
<tr>
<td>Q2</td>
<td>`r q2_text`</td>
</tr>
<tr>
<td>Q2 key</td>
<td>`r q2_answers`</td>
</tr>
<tr>
<td>Q2 percent correct</td>
<td>`r q2_pct_correct`</td>
</tr>
</table>

也不工作:

<div data-show-if="has_two_qs">
<table border=1 frame=hsides rules=rows>  
<tr>
<td>Q2</td>
<td>`r q2_text`</td>
</tr>
<tr>
<td>Q2 key</td>
<td>`r q2_answers`</td>
</tr>
<tr>
<td> Q2 percent correct</td>
<td>`r q2_pct_correct`</td>
</tr>
</table>
</div>

使用@guasi建议的一些解决方案,我能够通过使用htmltools包中的HTML函数拼凑出一个不美观但可行的解决方案:

{r, eval = has_two_qs, echo = FALSE}
tq2_1 <- "<table frame=hsides rules=rows>
<tr>
<td>SAQ Q2</td>
<td>"

tq2_2 <- "</td>
</tr>
</table>"

然后:

{r, eval = has_two_qs, echo=FALSE}
library(htmltools)
library(knitr)
HTML(tq2_1)
asis_output(saq2_text)
HTML(tq2_2)

此解决方案需要htmltools包。如果可以将表的输出存储在变量中,则可以使用If语句打印输出。

{r echo=FALSE}
library(htmltools)
table_q2 = NULL
table_q2 <- "<table border=1 frame=hsides rules=rows>  
<tr>
<td>Q2</td>
<td>`r q2_text`</td>
</tr>
<tr>
<td>Q2 key</td>
<td>`r q2_answers`</td>
</tr>
<tr>
<td> Q2 percent correct</td>
<td>`r q2_pct_correct`</td>
</tr>
</table>"
{r echo=FALSE}
if (!is.null(table_q2)) HTML(table_q2)

在本例中,当没有table_q2输出时,您必须将table_q2初始化为NULL,否则会出现降级投诉。

最新更新