使用shiny dashboard动态侧边栏时出现mongolite报错如何解决
报错根因
该报错由R包命名空间冲突触发:mongolite包内置了同名的menuItem函数,若mongolite的加载顺序晚于shinydashboard,全局环境中的menuItem会默认指向mongolite的实现。动态生成侧边栏时是运行时调用该函数,会触发MongoDB连接相关的参数校验,因此抛出is.character(db) not TRUE的报错;而静态侧边栏是在应用启动加载阶段就完成渲染,调用的是先加载的shinydashboard的menuItem,因此不会触发报错。
除此之外你的代码还存在两处需要修正的问题:
- 客户端输出ID拼写错误:
siderbarMenuOutput应为sidebarMenuOutput lapply生成的是菜单列表,需要包裹在sidebarMenu中才能被renderMenu正常识别,同时你原有代码中menuItem的调用缺少右括号
解决方案
方案1(最稳妥,无后续冲突隐患)
调用时显式指定menuItem的所属包,完全避免命名空间覆盖的影响,修正后的代码如下:
客户端代码
sidebarMenuOutput('menu')
服务端代码
output$menu <- renderMenu({ menu_list <- lapply(c('1','2','3'), function(x) { # 显式指定使用shinydashboard的menuItem实现 shinydashboard::menuItem(x, tabName = paste0('item_',x)) }) # 将菜单列表传入sidebarMenu do.call(shinydashboard::sidebarMenu, menu_list) })
方案2(调整包加载顺序)
调整全局代码中包的加载顺序,确保library(shinydashboard)写在library(mongolite)之后,让后加载的shinydashboard的menuItem覆盖mongolite的同名函数即可解决问题。
内容的提问来源于stack exchange,提问作者Александр Вьюн
相关产品推荐
相关产品推荐

