R Shiny Modules - 无法将类型“闭包”强制转换为字符类型向量

Jab*_*key 5 r shiny shinydashboard

闪亮模块环境的新手,我正在尝试设置一个基本脚手架,以将 UI 的选项卡式组件和其他组件从 ui.r 和 server.r 中分离出来

目前我有以下4个文件:

用户界面

navbarPage(id = "main", windowTitle = "Dashboard Title", position = 
"fixed-top", header = "Header Text?", title = "Application Logo <To Do>",

       navbarMenu("Company Dashboards", icon = icon("dashboard"),

                  tabPanel(title = "Sales", value = "SalesModule", icon = icon("bar-chart-o"), salesModuleUI("SalesModule")))
Run Code Online (Sandbox Code Playgroud)

服务器.r

shinyServer(function(input, output, session){


### Modules
callModule(module = salesModule, id = "SalesModule")


})
Run Code Online (Sandbox Code Playgroud)

全局.r

#######
# Libraries
#######

library(shiny)
library(shinydashboard)
library(dplyr)
library(highcharter)
library(DT)


#######
# Source Files
#######

source("modules/salesModule.r")
Run Code Online (Sandbox Code Playgroud)

销售模块.r

salesModuleUI <- function(id){

ns <- NS(id)

}


######
# salesDashboard Server
######

salesModule <- function(input,output,session){

ns <- session$ns

}
Run Code Online (Sandbox Code Playgroud)

如果我从 ui.r 中删除“value = salesModule”和 salesModuleUI 调用,则应用程序加载正常。一旦我添加这些内容以使用 salesModuleUI 填充选项卡面板(任一 UI 现在应该为空),我就会收到错误:

警告:as.character 中的错误:无法将类型“closure”强制转换为“character”类型的向量

我尝试查看: r 闪亮错误 as.vector(x, "character") 中的错误:无法强制类型 'closure' 为 'character' 类型的向量

但这个问题似乎与代码中的反应性调用有关,我还没有为此添加反应性。我还评论了: https: //github.com/FrissAnalytics/shinyJsTutorials

他的代码就是从这里提取此设置的结构的。

强制问题似乎相当常见,修复围绕传递的数据类型和期望进行。但是,从我可以排除的情况来看,代码应该需要一个字符向量,而我正在传递一个字符向量。

想一想我哪里错了?

Gre*_*lia 0

问题是模块的 UI 部分返回命名空间函数(不可见)。因此,shiny 尝试将函数(类型:闭包)嵌入到您的 UI 代码(类型:字符**)中,这会导致上述错误消息。

as.character 中的错误:无法将类型“closure”强制为“character”类型的向量

如果您将模块 ui 的定义更改为

salesModuleUI <- function(id) {
  ns <- NS(id)
  return(NULL)
}
Run Code Online (Sandbox Code Playgroud)

错误消失了,因为NULL可以嵌入到闪亮的 UI 定义中。这是一个使用上述 UI 的最小应用程序。

shinyApp(
  ui = fluidPage(
    salesModuleUI("moduleId")
  ),
  server = function(input, output, session) {}
)
Run Code Online (Sandbox Code Playgroud)

** 实际上,闪亮的 UI 有自己的类shiny.tag,可以是类型listcharacter取决于用例。然而shiny在将R对象转换为shiny.tag对象时,依赖于as.character泛型。