【问题标题】:R: How can I code repetitive output into an Rmarkdown file?R:如何将重复输出编码到 Rmarkdown 文件中?
【发布时间】: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)))
}

现在我只需编辑myFunctionmyDisplay 即可更改整个文档。

【问题讨论】:

  • 您可以使用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


【解决方案1】:

尝试将您的 eval 包装在 cat() 中(连接并打印)以哄 R 写下一些内容:

{r, eval = T, results = 'asis'} #I tried with and without "asis"
for(i in myDisplay){
  cat(eval(parse(text = i)))
}

【讨论】:

  • 我在尝试时遇到错误:cat(eval(parse(text = i))) 中的错误:参数 1(类型 'list')不能由 'cat' 处理
  • 这……真的,真的很奇怪。我能够重现您在问题陈述中描述的所有内容,但是这个修复对我有用。 dropbox.com/s/2aqbojh1714kxsz/knittest.html?dl=0
  • 我正在我的真实数据集中尝试它,所以也许还有另一个问题。我会调查的。
  • 是的,我很想知道它是否适用于您的(制作精良的)玩具示例。如果是这样,那可能很有启发性。
  • 我确实工作了。问题是在我的真实输出列表中,列表项之一是 ggplot2 图。出于某种原因, cat() 不喜欢那样。但我把它拿出来,它奏效了。我可以轻松解决这个问题。可以在函数中编辑绘图。谢谢!
猜你喜欢
  • 2015-05-07
  • 2016-08-19
  • 1970-01-01
  • 2016-10-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 2017-01-01
相关资源
最近更新 更多