r - 如何在 R Shiny 应用程序中将变量从模块返回到服务器?
问题描述
我在 R Shiny 应用程序中将变量从模块返回到服务器时遇到了惊人的困难。在模块中,我想在观察到按下按钮时返回一个值,所以我将return()
语句包装在observeEvent()
. 但是,没有返回所需的值,整个observeEvent()
块似乎都是。
我试图创建一个最小的工作示例来概述以下问题:
用户界面
# ui.R
fluidPage(
input_module_ui("input"),
actionButton("print_input_button",
label = "Print Input")
)
服务器.R
# server.R
function(input, output, session) {
# Calling input module.
input_module_return <- callModule(input_module, "input")
observeEvent(input$print_input_button, {
print(input_module_return)
})
}
全局.R
# global.R
source("modules/input.R")
输入.R
# input.R
input_module_ui <- function(id) {
ns <- NS(id)
tagList(
textInput(ns("text_input"),
label = h2("Input Text:")),
actionButton(ns("submit_input"),
label = "Submit Input")
)
}
input_module <- function(input, output, session) {
print("I should only print once")
observeEvent(input$submit_input, {
print("Return input")
return(input$text_input)
})
}
在测试这个应用程序时,我在文本输入框中输入了“test”并提交了我的输入。但是,当我尝试打印我的输入,而不是像我期望的那样打印“测试”时,打印了以下内容:
<Observer>
Public:
.autoDestroy: TRUE
.autoDestroyHandle: function ()
clone: function (deep = FALSE)
.createContext: function ()
.ctx: environment
destroy: function ()
.destroyed: FALSE
.domain: session_proxy
.execCount: 3
.func: function ()
initialize: function (observerFunc, label, suspended = FALSE, priority = 0,
.invalidateCallbacks: list
.label: observeEvent(input$submit_input)
.onDomainEnded: function ()
onInvalidate: function (callback)
.onResume: function ()
.prevId: 1896
.priority: 0
resume: function ()
run: function ()
self: Observer, R6
setAutoDestroy: function (autoDestroy)
setPriority: function (priority = 0)
suspend: function ()
.suspended: FALSE
我相信这对应于最后一个块input.R
:
observeEvent(input$submit_input, {
print("Return input")
return(input$text_input)
})
我怎样才能让这个应用程序按预期工作并在观察到input$text_input
时返回input$submit_input
?
解决方案
你已经非常接近让它发挥作用了。闪亮模块的诀窍在于将变量传入和传出它们需要将变量作为反应值传递。我对您的代码做了两个小改动,以获得我认为您希望看到的内容。
首先是input$text_input
从服务器模块返回一个反应版本(而不是从观察者本身,它应该只是告诉应用程序你想要发生什么):
input_module <- function(input, output, session) {
print("I should only print once")
observeEvent(input$submit_input, {
print("Return input")
})
return(reactive({input$text_input}))
}
第二个变化是现在的输出input_module
是反应式的。如果您想要值而不是函数内容,则需要使用()
. 因此,在您的服务器功能中:
server <- function(input, output, session) {
# Calling input module.
input_module_return <- callModule(input_module, "input")
observeEvent(input$print_input_button, {
print(input_module_return())
})
}
输出:
Listening on http://127.0.0.1:6796
[1] "I should only print once"
[1] "Return input"
[1] "test"
推荐阅读
- reactjs - Toggle Button onClick 不会改变我的 div 的位置
- java - RSA 加密不适用于从 XML 文件中获取的密钥
- ios - 我可以绕过苹果 30% 的 App 购买费吗?
- javascript - JavaScript:模块/要求未定义
- mysql - SQL加入和计算3个表,包括NULL
- html - 在 Google 驱动器中托管自定义 HTML
- arrays - elasticsearch 将数据转换为数组
- php - 我收到 xampp 的 sql server 连接错误
- bash - Jenkins - 在 sh 脚本中分配变量
- mql4 - 如何获得低买高卖但代码错误的订单