程序化生成Rmarkdown时HTML Widget非末尾打印失效问题求助
解决程序化生成Rmarkdown中HTML Widget的显示问题
你碰到的这个问题,核心是knitr对ggplot对象和HTML Widget的处理逻辑完全不同:
- ggplot这类绘图对象调用
print()时,会触发R的绘图设备生成图像,knitr会自动捕获这些图像输出并插入到文档里,哪怕后面还有其他内容也不受影响。 - 但HTML Widget本质是包含HTML/JS的特殊对象,当它作为函数的返回值时,knitr会调用
knit_print()来将其转换为可嵌入的HTML代码;但如果用print()包裹它,在results='asis'的代码块里,print()只会输出对象的结构信息,而不会触发knitr的特殊渲染逻辑,自然就看不到Widget了。
下面给你两种可行的解决方案:
方案1:用htmltools::tagList()组合内容
把标题、Widget等元素都用tagList()打包,knitr会自动识别并正确渲染所有内容,不需要手动用cat()输出文本:
gen_rmarkdown_widgets <- function() { htmltools::tagList( htmltools::h1("Head 1"), DT::datatable(iris), htmltools::h1("Head 2") ) }
然后在代码块里直接调用函数即可(甚至可以去掉results='asis',因为tagList会被knit_print自动处理):
gen_rmarkdown_widgets()
方案2:手动调用knit_print()输出Widget
如果你还是想保留cat()输出文本的方式,可以手动用knit_print()把Widget转换成HTML字符串,再用cat()输出,这样就能和后续内容一起正常显示:
gen_rmarkdown_widgets <- function() { cat("# Head 1\n\n") # 将Widget转换为HTML字符串并输出 cat(knitr::knit_print(DT::datatable(iris))) cat("\n# Head 2\n\n") }
这个版本可以继续使用results='asis'的代码块:
gen_rmarkdown_widgets()
两种方案都能让HTML Widget像ggplot一样,在后续还有内容的情况下正常显示。你可以根据自己的代码习惯选择其中一种。
内容的提问来源于stack exchange,提问作者Richard J. Acton
相关产品推荐
相关产品推荐

