Shiny: Ошибка при обращении к идентификатору renderUI внутри модуля - PullRequest
0 голосов
/ 13 мая 2019

Я строю модуль Shiny с renderUI, где я ссылаюсь на идентификаторы, созданные внутри функции сервера модуля:

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(), я получаю следующую ошибкупри запуске функции серверного модуля:

Ошибка в сеансе $ makeScope (id): попытка применить не-функцию

Не вижу причины этой проблемы, любойПодсказки будут очень признательны!

1 Ответ

1 голос
/ 13 мая 2019

Во-первых, вы должны использовать ns в module_ui:

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

Вы должны определить ui и server следующим образом:

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

Что-тоelse: установите drop = FALSE при выборе некоторых столбцов кадра данных:

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

в противном случае вы получите вектор, если выберете только один столбец, при drop=FALSE вы получите кадр данных с одним столбцом.

...