【问题标题】:Shiny: Error when referring to renderUI's id inside the moduleShiny:在模块内引用 renderUI 的 id 时出错
【发布时间】:2019-09-30 14:57:57
【问题描述】:

我正在使用 renderUI 构建一个 Shiny 模块,其中我指的是模块服务器函数内部生成的 ID:

library(shiny)
library(DT)
library(dplyr)

module_ui <- function(id){
  ns <- shiny::NS(id)
  shiny::tagList(
    fluidPage(uiOutput('test_ui'))

  )
}


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

  ns <- session$ns

  output$test_ui <- renderUI({

    shiny::fluidPage(
      shiny::selectizeInput(
        inputId = ns('plot_vars'),
        label = 'Choose variables to plot',
        choices = colnames(mtcars),
        selected = colnames(select(mtcars, mpg, wt)),
        multiple = TRUE
      ),
      verbatimTextOutput(ns('text')),
      DT::dataTableOutput(ns('d_plot'))
    )

    })

  output$text <- renderText({
    input$plot_vars
  })

  output$d_plot <- DT::renderDataTable({

    input_data <- mtcars[, input$plot_vars]

    DT::datatable(input_data)

  })

}


ui <- module_ui('XXX')
server <- callModule(module, 'XXX')

shinyApp(ui, server)

尽管始终虔诚地应用ns(),但在运行服务器模块功能时出现以下错误:

session$makeScope(id) 中的错误:尝试应用非函数

在这里看不到是什么导致了问题,非常感谢任何提示!

【问题讨论】:

    标签: r module shiny shinydashboard


    【解决方案1】:

    首先,你必须在module_ui中使用ns

    module_ui <- function(id){
      ns <- NS(id)
      tagList(
        fluidPage(uiOutput(ns('test_ui')))
      )
    }
    

    您必须像这样定义uiserver

    ui <- fluidPage(
      module_ui('XXX')
    )
    server <- function(input, output, session){
      callModule(module, 'XXX')
    }
    

    其他:当您选择数据框的某些列时设置drop = FALSE

    input_data <- mtcars[, input$plot_vars, drop = FALSE]
    

    否则,如果您只选择一列,则会得到一个向量,而使用drop=FALSE,您会得到一个包含一列的数据框。

    【讨论】:

    • 这很奏效!非常感谢您的帮助和drop = FALSE 的精彩提示!
    猜你喜欢
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    相关资源
    最近更新 更多