簡體   English   中英

R Shiny - 在 Shiny 模塊中使用“session$sendCustomMessage”設置輸入值

[英]R Shiny - Setting input values with 'session$sendCustomMessage' inside a Shiny module

我的應用程序包含一個名為set value的按鈕。 我想用sendCustomMessagesetInputValue輸入的值重置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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM