【发布时间】:2020-07-03 15:37:08
【问题描述】:
我正在对数据集进行复杂的探索性分析。我创建了一个函数,它将获取所需的变量,运行和评估几个模型,然后返回一个包含各种结果和图的列表。我可以轻松地在预测变量和结果变量的不同组合上运行它。我还想创建一个“函数”或可重复的脚本,它将在 rmarkdown 输出中显示结果,因此当我想对输出进行更改时,我不必编辑每个块。 (例如,我刚刚在函数中添加了敏感性分析,但现在我必须编辑大约 45 个块才能显示结果。)
简化示例:
#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)")
对于我创建的每个分析输出列表,我想运行 myDisplay 中的内容。因此,在以下部分中,我尝试了:
{r, eval = T, results = 'asis'} #I tried with and without "asis"
for(i in myDisplay){
eval(parse(text = i))
}
当我在控制台中运行 for 循环时,我得到了预期的输出,但是当我编织我的 rmarkdown 文件时,我实际上什么也没得到。没有警告、消息、错误或任何东西。
有没有办法做到这一点?和eval(parse(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)))
}
现在我只需编辑myFunction 和myDisplay 即可更改整个文档。
【问题讨论】:
-
您可以使用
knitr::knit_child(text = i),而不是eval(parse(...)),它会返回一个带有可直接使用的渲染内容的character(需要results="asis",你有)。 -
@r2evans 谢谢,但这会为每个 i 返回“|||0%||...| 100% 没有 Rcode 的普通测试”。有什么我想念的吗?
-
不是临时的,但我还没有对此进行完整的测试(忙于“工作”,抱歉)。顺便说一句:
library(dplyr,tidyr,kableExtra,pander)语法不正确。它实际上对第二个参数有点作用,但实际上它解析为library(package="dplyr", help="tidyr", pos="kableExtra", lib.loc="pander"),这很可能不是您想要的。 -
@r2evans 是的,我在最后一刻把那个库调用放在那里只是为了确认我正在使用的包。以为我会为此而烦恼:)
标签: r r-markdown