R Shiny应用内嵌R Markdown文件时布局尺寸异常如何修复
问题根因
布局收缩是两个问题叠加导致的:
markdown::markdownToHTML()默认生成完整独立HTML文档,自带整套页面结构、默认样式和固定宽度容器,和Shiny、shinydashboard已经加载的页面结构、Bootstrap样式冲突,双重容器嵌套会把内容挤压到中间窄区域。- 宽度设置冗余:你在外层用了
column(9)(占父容器9/12宽度),内层又给box()设置width=9,宽度按父容器比例计算,相当于box实际只占外层column的9/12宽度,叠加后实际可用宽度进一步缩小。
修复步骤
修改Rmd渲染逻辑,只输出HTML片段,禁止加载markdown默认样式
把server里渲染operations的代码替换为:output$operations <- renderUI({ req(input$mySliderText==1) knit_res <- knit('trial1.rmd', quiet = TRUE) HTML(markdown::markdownToHTML( knit_res, fragment.only = TRUE, stylesheet = "" )) })其中
fragment.only = TRUE会让函数只返回Rmd渲染后的正文HTML片段,不生成<html>、<head>、<body>等完整页面标签;stylesheet = ""会禁用markdown包默认自带的样式表,完全继承Shiny页面的样式,避免冲突。修正冗余的宽度设置
把两个box()组件的width参数从9改成12,让box占满外层column(9)的全部宽度,不要二次缩放:# Operations模块box示例 box( title = "Operations ", closable = FALSE, width = 12, status = "primary", solidHeader = FALSE, collapsible = TRUE, uiOutput("operations") )Challenges模块的box做相同修改即可。
可选优化:如果你的Rmd文件里需要自定义样式,不要在Rmd的yaml头里声明样式,直接把CSS代码写到Shiny UI的
dashboardBody()里,用tags$style()包裹即可,避免重复加载样式。
内容的提问来源于stack exchange,提问作者Mohamed Osman
相关产品推荐
相关产品推荐

