[英]Shiny and JavaScript interaction with session$sendCustomMessage
[英]R Shiny - Setting input values with 'session$sendCustomMessage' inside a Shiny module
我的應用程序包含一個名為set value
的按鈕。 我想用sendCustomMessage
和setInputValue
輸入的值重置inp
到“HI”,每次set value
被點擊。 我正在為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)
並且似乎沒有附加任何時候 inputId 參數的 ns 前綴。
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)
使用sendCustomMessage()
您只是發送一個要在 JavaScript 中處理的 JSON 對象。 當您在 JS 中調用Shiny.setInputValue()
時,您已經丟失了有關會話的所有信息:僅保留消息數據。 在這種情況下,該消息恰好包含一個無作用域的輸入 id,這意味着您實際上是在為全局"inp"
輸入設置值。 因為自定義消息實際上可以做任何事情,所以會話無法對其進行修改。
但是,當您使用sendInputMessage()
,上下文是不同的:現在會話知道有一個inputId
並且它應該是范圍的,它會自動執行; 看到這里。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.