реактивный входной вектор странно использует кавычки в блестящих модулях

Предварительные условия: приложение Shiny с помощью модуля, содержащего вывод пользовательского интерфейса. Выходные данные пользовательского интерфейса содержат любые входные данные (например textInput). Все идентификаторы (UIOutput и Input) генерируются с использованием ns()

Наблюдения: мой inputвектор внутренне сохраняется с кавычками. Это не было бы проблемой, но мешает мне использовать ввод в javascript (in conditionalInput(condition='input.myModule-myInputtest=="someText"')). Как я могу достичь того, что input$'mymodule'называется input$myModule? Это ошибка или я делаю что-то не так?

Заранее спасибо и с наилучшими пожеланиями

скриншот приложения

Минимальный пример:

library(shiny)

ui <- fixedPage(
  h2("Module example"), myModuleUI("myModule"), verbatimTextOutput("summary")
)
server <- function(input, output, session) {
  callModule(myModule, "myModule", stringsAsFactors=F)
  output$summary <- renderPrint({ reactiveValuesToList(input) })
}
shinyApp(ui, server)

myModuleUI <- function(id) {
  ns <- NS(id)
  uiOutput(ns("myInput"))
}
myModule <- function(input, output, session, stringsAsFactors) {
   output$myInput <- renderUI({ textInput(ns("myInputtest"), "A Text Input") })
 }

3 ответа

  1. Извините за ответ на мой собственный вопрос, но я думаю, что это то, с чем другие люди столкнутся.

    Использование ввода в javascript (т. е. в conditionPanel condition) возможно через input['myModule-myInputtest'], вместо точечной нотации, которая может использоваться в ситуациях без блестящих модулей.

  2. Вам нужно сделать следующее:

    * Использовать tagList () внутри myModuleUI

    *Не используйте ns () внутри myModule

    Примечание:

    ns() связывает id из callModule () с любой переданной ему строкой. Например, ns («myInputtest») дает » myModule-myInputtest»

    library(shiny)
    
    ## Module UI ----
    myModuleUI <- function(id) {
      ns <- NS(id)
      # taglist should be added here
      tagList(
        uiOutput(ns("myInput"))
      )
    }
    
    ## Module Server ----
    myModule <- function(input, output, session, stringsAsFactors) {
      output$myInput <- renderUI({ 
        textInput("myInputtest",
                  "A Text Input") 
      })
    }
    
    ## UI ----
    ui <- fixedPage(
      h2("Module example"),
      myModuleUI("myModule"),
      verbatimTextOutput("summary")
    )
    
    ## Server ----
    server <- function(input, output, session) {
      callModule(myModule, "myModule", stringsAsFactors=F)
      output$summary <- renderPrint({reactiveValuesToList(input)})
    }
    
    # Run the application ---------------------------------------------------------
    shinyApp(ui = ui, server = server)
    

    Введите описание изображения здесь

  3. Вы нашли очень интересный случай края. К счастью, есть еще один способ доступа inputк детям, как вы уже обнаружили (используйте квадратные скобки, а не точки). Для тех, кто может наткнуться на это в будущем, вот минимальный рабочий пример, включая условную панель:

    library(shiny)
    
    myModuleUI <- function(id) {
      ns <- NS(id)
      tagList(
        uiOutput(ns("myInput")),
        conditionalPanel(
          condition = "input['myModule-myInputtest'] === 'hello'",
          # condition = "console.log(input['myModule-myInputtest'])",   # useful for debugging
          sliderInput(ns("breakCount"), "Break Count", min=1, max=1000, value=10)
        )
      )
    }
    myModule <- function(input, output, session, stringsAsFactors) {
      output$myInput <- renderUI({
        textInput(session$ns("myInputtest"), "A Text Input") 
      })
    }
    
    ui <- fixedPage(
      h2("Module example"), 
      myModuleUI("myModule"), 
      verbatimTextOutput("summary")
    )
    
    server <- function(input, output, session) {
      callModule(myModule, "myModule", stringsAsFactors=F)
      output$summary <- renderPrint({ reactiveValuesToList(input) })
    }
    
    shinyApp(ui, server)