反应输入向量奇怪地在闪亮的模块中使用引号
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)
先决条件: 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)