【发布时间】:2020-03-19 05:38:08
【问题描述】:
我的应用程序包含一个名为 set value 的按钮。每次单击set value 时,我想使用sendCustomMessage 和setInputValue 将输入inp 的值重置为“hi”。我正在为sendCustomMessage 方法使用一个名为setInputVal 的包装函数。
如果我在 setInputVal 调用中为输入 id 指定命名空间前缀,inp 的值会按预期重置,但如果我将其忽略则不会。所以setInputVal(session, ns('inp'), 'hi') 有效,但setInputVal(session, 'inp', 'hi') 无效。
为什么我需要在这里指定命名空间前缀? 我的想法是session$sendCustomMessage 中的session$ 位意味着消息正在访问模块的会话,因此命名空间前缀不是是必需的(类似于在模块的服务器函数中我们使用input$inp 访问inp 的值而不是input[[ns('inp')]])。
为什么我们在模块服务器中使用update*函数(如updateSelectInput)时,不需要指定ns前缀?(我已经包含UI 中的 selectInput 和服务器中的 observeEvent 演示 updateSelectInput。)当我查看 updateSelectInput 的代码时,我发现它也使用了 session$sendInputMessage(inputId, message) 并且似乎没有将 ns 前缀附加到 inputId参数。
library(shiny)
setInputVal <- function(session, inputId, value) {
session$sendCustomMessage(
type = 'setInputVal',
message = list(
id = inputId, value = value)
)
}
# module UI ---------------------------------------------------------------
modUI <- function(id) {
ns = NS(id)
tagList(
tags$head(tags$script("Shiny.addCustomMessageHandler('setInputVal', function(data) {
Shiny.setInputValue(data.id, data.value);
});")),
# selectInput(ns('letter'), 'letter', letters),
actionButton(ns('set'), 'set value')
)
}
# module server -----------------------------------------------------------
modServer <- function(input, output, session) {
ns = session$ns
observeEvent(input$set, setInputVal(session, 'inp', value = 'hi'))
observe(print(input$inp))
# observeEvent(input$set, {
#
# updateSelectInput(session, 'letter', selected = 'u')
#
# print(input$letter)
# })
}
# main UI -----------------------------------------------------------------
ui <- fluidPage(modUI('hi'))
# main server -------------------------------------------------------------
server <- function(input, output, session) {
callModule(modServer, 'hi')
}
# Run app
shinyApp(ui, server)
【问题讨论】:
-
useShinyUtils()来自哪里? -
对不起,这是一个错字,我现在已经更正了。