使用闪亮的模块和shinydashboard:shiny.tag错误

时间:2016-06-02 13:38:57

标签: r shiny shinydashboard

我正在尝试在shinydashboard应用程序中创建和使用闪亮的模块,但我不断收到此错误:

Error in FUN(X[[i]], ...) : Expected an object with class 'shiny.tag'.

以下是尽可能缩小的应用程序:

ui.r

library(shiny)
library(shinydashboard)

source("modules.r")

ui <- dashboardPage(
 dashboardHeader(
  title = "Shiny modules and shinydashboard"
 ),

 dashboardSidebar(
  sidebarMenu(
   menuItem("PointA") 
  )
 ),

 dashboardBody(
  tabItems(
   fooUI("myid") 
  )
 )
)

server.r

server <- function(input, output) {
 callModule(foo, "myid") 
}

modules.r

fooUI <- function(id) {
 ns <- NS(id)

 tagList(
  tabItem(
   tabName = "PointA",
   textOutput(ns("text"))
  )
 )
}

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

 output$text <- renderText(
  rnorm(1)
 )
}

我做错了什么?我有其他类型的模块可以在“正常”闪亮的应用程序中工作,但是,每当我尝试在shinydashboard中使用模块时,它都会失败。

我使用的是Rshinyshinydashboard的最新版本。这不是问题所在。

3 个答案:

答案 0 :(得分:2)

shinydashboardtagList

的问题

如上所述here

您需要简单使用

   ui <- dashboardPage(
  dashboardHeader(
    title = "Shiny modules and shinydashboard"
  ),

  dashboardSidebar(
    sidebarMenu(
      menuItem("PointA",tabName = "PointA") 
    )
  ),

  dashboardBody(
    tags$div( fooUI("myid"), class = "tab-content" )

)
)

更新

tabName

中还需要menuItem
menuItem("PointA_",tabName = "PointA") 

解释

如你所见

tabItems
function (...) 
{
    lapply(list(...), tagAssert, class = "tab-pane")
    div(class = "tab-content", ...)
}
<environment: namespace:shinydashboard>

list用于...,如果您已将列表作为arg,则无法使用。

所以其他变种它创建了新的tabItems函数,如

tabItems1=function (...) 
    {
        lapply(..., tagAssert, class = "tab-pane")
        div(class = "tab-content", ...)
    }
environment(tabItems1)=environment(tabItems)

然后您可以将tabItems1tagList

一起使用

答案 1 :(得分:0)

按照@Batanichek的回答向我指出了问题的根源(谢谢),我只是删除了tagList()定义中的fooUI命令。这很方便地解决了这个问题!

答案 2 :(得分:0)

两件事:

  1. 在menuItem函数中,似乎tabName是必需的
  2. 将tabItem从模块移动到ui(tabItem可以容纳您的模块)

UI

ui <- dashboardPage(
  dashboardHeader(
    title = "Shiny modules and shinydashboard"
  ),

  dashboardSidebar(
    sidebarMenu(
      menuItem("PointA", tabName = "PointA") 
    )
  ),

  dashboardBody(
    tabItems(
      tabItem("PointA",
              fooUI("myid")
      )
    )
  )
)

模块

fooUI <- function(id) {
  ns <- NS(id)

  tagList(
    tabName = "PointA",
    textOutput(ns("text"))
  )
}

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

  output$text <- renderText(
    rnorm(1)
  )
}