我可以在闪亮的模块中使用updateTextInput()吗?

时间:2016-02-23 16:47:23

标签: r module shiny textinput

我编写了一个相当直接的模块,它由客户端上的textInput和更新textInput值的服务器函数组成。为此,我在服务器函数中调用updateTextInput()。但是,客户端上的textInput未更新。

如何让我的模块服务器功能更新客户端上的textInput?

以下是我的代码的简化版本:

带模块定义的

global.R

# Client side. 
specifyInput <- function(id, points){  
    ns <- NS(id)
    tagList(textInput(ns('points'), label='Total', value=points))
}

# Server side. 
specify <- function(input, output, session){
    ns <- session$ns

    observe({
        new.value = 2 * as.numeric(input$points)
        #this line does not seem to work
        updateTextInput(session, ns('points'), value = new.value)
    })

    # create dataframe with entered value
    df <- reactive(data.frame(points = as.numeric(input$points)))

    # return the dataframe
    return(df())
}

ui.R

    specifyInput("ttlEntry", 10)

server.R

        function(input, output, session){
          test <- reactive(callModule(specify, "ttlEntry"))

          #somewhere in the code, call test()
        }

实际上,当用户输入句点时,我想在输入的值后面附加.5,例如,如果用户输入“10”。然后更新textInput以显示“10.5” 但是出于测试目的,我已将该代码更改为new.value = 2 * ...

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

有几点需要注意,都连接到模块服务器组件:

  1. 我认为你不需要ns <- session$ns - 我认为这是为在模块中使用renderUI而保留的(参见this article)。
  2. 您不需要在模块服务器中的ns()中包装inputId - 因此ns('points')应更改为'points'
  3. 您不应该返回df(),而只是在没有括号的情况下返回df
  4. 完成这些更改后,应用程序可以正常运行,但请注意,已创建反馈循环,因此输入的值会持续加倍。您需要重新编写代码逻辑,只需将输入的内容加倍(或者按照您的描述添加.5)并保留它。

    下面发布了一个有效的单一文件应用版本:

    # Client side. 
    specifyInput <- function(id, points){  
      ns <- NS(id)
      textInput(ns('points'), label = 'Total', value = points)
    }
    
    # Server side. 
    specify <- function(input, output, session, ...){
    
      observe({
        new.value = 2 * as.numeric(input$points)
        updateTextInput(session, 'points', value = new.value)
      })
    
      # create dataframe with entered value
      df <- reactive(data.frame(points = as.numeric(input$points)))
    
      # return the dataframe
      return(df)
    }
    
    # ui
    ui <- specifyInput("ttlEntry", 10)
    
    # server
    server <- function(input, output, session){
      test <- callModule(specify, "ttlEntry")
    }
    
    shinyApp(ui = ui, server = server)