我编写了一个相当直接的模块,它由客户端上的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 * ...
非常感谢任何帮助。
答案 0 :(得分:1)
有几点需要注意,都连接到模块服务器组件:
ns <- session$ns
- 我认为这是为在模块中使用renderUI而保留的(参见this article)。ns()
中包装inputId - 因此ns('points')
应更改为'points'
。df()
,而只是在没有括号的情况下返回df
。完成这些更改后,应用程序可以正常运行,但请注意,已创建反馈循环,因此输入的值会持续加倍。您需要重新编写代码逻辑,只需将输入的内容加倍(或者按照您的描述添加.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)