R:如何将重复输出编码到Rmarkdown文件中?
我正在对数据集进行复杂的探索性分析。我创建了一个函数,它将获取所需的变量,运行并评估几个模型,然后返回一个包含各种结果和绘图的列表。我可以很容易地在预测变量和结果变量的不同组合上运行它。我还想创建一个“函数”或可重复的脚本,它将在rmarkdown输出中显示结果,这样当我想要对输出进行更改时,就不必编辑每个块。(例如,我刚刚在函数中添加了敏感性分析,但现在我必须编辑大约45个块才能显示结果。) 简化示例:R:如何将重复输出编码到Rmarkdown文件中?,r,r-markdown,R,R Markdown,我正在对数据集进行复杂的探索性分析。我创建了一个函数,它将获取所需的变量,运行并评估几个模型,然后返回一个包含各种结果和绘图的列表。我可以很容易地在预测变量和结果变量的不同组合上运行它。我还想创建一个“函数”或可重复的脚本,它将在rmarkdown输出中显示结果,这样当我想要对输出进行更改时,就不必编辑每个块。(例如,我刚刚在函数中添加了敏感性分析,但现在我必须编辑大约45个块才能显示结果。) 简化示例: #Packages used: dplyr, knitr, kableExtra, pan
#Packages used: dplyr, knitr, kableExtra, pander
data("airquality")
lm.1 <- lm(Solar.R ~ Wind, data = airquality, na.action = na.omit)
lm.2 <- lm(Solar.R ~ Wind + Temp, data = airquality, na.action = na.omit)
#The real output list is bigger/more complex:
myList <- list(model.1 = lm.1, model.2 = lm.2, bic = BIC(lm.1,lm.2))
#Create a character vector containing each line of display code I wish to run:
myDisplay <- c("kable('Model Comparisons', col.names = NULL) %>%
kable_styling(bootstrap_options = 'striped', font_size = 20)",
"pander(myList$bic)",
"kable('Full Model Summary', col.names = NULL) %>%
kable_styling(bootstrap_options = 'striped', font_size = 20)",
"pander(myList$model.2)")
当我在控制台中运行for循环时,我得到了预期的输出,但是当我编织我的rmarkdown文件时,我实际上什么也没有得到。没有任何警告、消息、错误或任何东西
有办法做到这一点吗?它是否与eval(解析(text=)
有关?还有别的东西可以试试吗
后脚本:@Aaron Montgomery建议添加
cat(eval(parse(text=i))
。我的真实代码有一个小问题。其中一个列表项是由ggplot()
返回的绘图cat()
无法处理该请求。这没关系,因为这很容易解决
现在,我的每个分析的代码块如下所示:
{r, results = 'asis'}
myList <- myFunction(X,Y,Z)
myList$plot
for(i in myDisplay){
cat(eval(parse(text = i)))
}
{r,results='asis'}
myList尝试将您的eval
包装在cat()
(连接并打印)中,以引导R写下一些内容:
{r, eval = T, results = 'asis'} #I tried with and without "asis"
for(i in myDisplay){
cat(eval(parse(text = i)))
}
您可以使用knitr::knit_child(text=i)
,而不是eval(parse(…)
,它将返回一个字符,带有可直接使用的呈现内容(需要results=“asis”
。@r2evans谢谢,但这将为每个i返回“| | | | | 0%| | | |·| | | | | | | | | | |。有什么我遗漏的吗?不是马上,但我还没有对此运行完整的测试(很抱歉,我正忙于“工作”)。顺便说一句:库(dplyr、tidyr、kableExtra、pander)
语法不正确。对于第二个参数,它实际上起到了一些作用,但实际上,它被解析为库(package=“dplyr”,help=“tidyr”,pos=“kableExtra”,lib.loc=“pander”)
,这很可能不是您想要的。@r2evans是的,我在最后一分钟把库调用放在那里,只是为了确认我正在使用的包。我想我会因此而生气:)我在尝试时遇到了一个错误:cat中的错误(eval(parse(text=I)):参数1(类型'list')不能由'cat'处理,这是。。。真的,真的很奇怪。我能够重现您在问题陈述中描述的所有内容,但是这个修复对我来说很有效。我正在我的真实数据集中尝试,所以可能还有另一个问题。我会研究一下。是的,我很好奇它是否适用于你的(非常精巧的)玩具示例。如果是这样的话,那可能很有启发性。我确实工作过。问题是在我的实际输出列表中,其中一个列表项是ggplot2绘图。出于某种原因,cat()不喜欢这样。但我把它拿了出来,它成功了。我可以很容易地解决这个问题。可以在函数中编辑该绘图。谢谢
{r, eval = T, results = 'asis'} #I tried with and without "asis"
for(i in myDisplay){
cat(eval(parse(text = i)))
}