反应输入向量奇怪地在闪亮的模块中使用引号

reactive input vector is strangely using quotes in shiny modules

先决条件: Shiny App 使用包含 UI 输出的模块。 UI 输出本身包含任何输入(例如 textInput)。所有 ID(UI 输出和输入)都是使用 ns()

生成的

观察: 我的 input 矢量在内部保存时带有引号。这没问题,但会阻止我使用 javascript(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") })
 }

很抱歉回答我自己的问题,但我认为这是其他人会遇到的事情。

可以通过 input['myModule-myInputtest'] 使用 javascript 中的输入(即在 conditionPanel 条件中),而不是可以在没有闪亮模块的情况下使用的点符号。

您需要执行以下操作:

*在 myModuleUI 中使用 tagList()

*不要在 myModule 中使用 ns()

:

ns() 将来自 callModule() 的 id 与传递给它的任何字符串连接起来。例如 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)

您发现了一个非常有趣的边缘案例。幸运的是,正如您已经发现的那样,还有另一种访问 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)