如何将flexdashboard应用转换为ui、server分离的标准Shiny结构?
Flexdashboard转标准Shiny UI/Server分离结构方案
报错原因
你遇到的报错是因为rmarkdown:::rmarkdown_shiny_server是rmarkdown包的内部未导出函数,接口会随版本迭代发生变化,你传入的render_args参数在当前版本的函数定义中已不支持,且未导出函数本身稳定性极差,不推荐正式场景使用。
Error in rmarkdown:::rmarkdown_shiny_server(dir, file, "UTF-8", T, render_args) :
unused argument (render_args)
方案1:临时修复原有代码
如果不想修改现有Rmd文档,可以调整启动代码适配当前版本的内部函数接口,不过该方案兼容性差,仅适合临时测试使用:
library(flexdashboard) library(shiny) library(dplyr) library(tibble) file <- 'example.Rmd' dir <- dirname(file) ui <- rmarkdown:::rmarkdown_shiny_ui(dir, file) server <- function(input, output, session) { rmarkdown:::rmarkdown_shiny_server(dir, file, encoding = 'UTF-8', render_args = list(envir = environment())) } shinyApp(ui, server)
方案2:手动重构为标准UI/Server分离结构(推荐)
该方案完全遵循Shiny的标准开发规范,不依赖任何内部函数,可维护性、兼容性和性能都最优,和你原有flexdashboard的外观、功能完全一致:
完整代码
# 加载依赖包 library(flexdashboard) library(shiny) library(dplyr) library(tibble) # -------------------------- # 全局静态数据预处理(仅启动时运行1次) # -------------------------- UF = c('AC', 'AM', 'AP', 'BA', 'CE', 'ES', 'PB', 'PE', 'AC', 'AC', 'AP') Coluna = c(30, 200, 7, 12, 854, 2, 78, 965, 12, 22, 12) id = 1:11 df <- data.frame(UF,Coluna,id) df_2 <- df %>% group_by(UF) %>% mutate(soma_1 = sum(Coluna), soma_2 = sum(id), media_1 = mean(Coluna), media_2 = mean(id)) %>% distinct(UF, .keep_all = TRUE) f_1 <- function(x) { df_2$Coluna[df_2$UF == x] } # -------------------------- # 独立UI定义 # -------------------------- ui <- flex_dashboard( title = "Untitled", orientation = "columns", vertical_layout = "fill", # 侧边栏配置 sidebar = sidebar( width = 300, strong("Control panel"), selectInput( inputId = "UF", label="Unidade federativa:", choices = unique(df_2$UF), selected = unique(df_2$UF)[1] # 配置默认值避免初始化报错 ) ), # 主体内容区 valueBoxOutput("coluna_box") ) # -------------------------- # 独立Server定义 # -------------------------- server <- function(input, output, session) { reac <- reactive({ tibble(input$UF) }) pred <- reactive({ temp <- reac() input$UF }) output$coluna_box <- renderValueBox({ valueBox( value = f_1(x = pred()), caption = "Coluna", color = "#008bbb", icon = "fa-users" ) }) } # 启动应用 shinyApp(ui, server)
重构说明
- 所有静态数据、工具函数放在全局区域,应用启动时仅运行一次,无需重复计算
- UI和Server完全独立拆分,符合Shiny标准开发规范,后续可自由扩展功能
- 完全保留原有flexdashboard的布局、样式和交互逻辑,和原Rmd版本表现一致
内容的提问来源于stack exchange,提问作者neves
相关产品推荐
相关产品推荐

