gpt4 book ai didi

r - 如何在 R Shiny 应用程序中将变量从模块返回到服务器?

转载 作者:行者123 更新时间:2023-12-01 11:16:27 25 4
gpt4 key购买 nike

在 R Shiny 应用程序中,我在将变量从模块返回到服务器时遇到了惊人的困难。在一个模块中,我想在观察到按下按钮时返回一个值,所以我将 return() 语句包装在 observeEvent() 内的一个 block 中.但是,没有返回所需的值,整个 observeEvent() block 似乎是。

我试图创建一个最小的工作示例来概述以下问题:

ui.R

# 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)
})

}

global.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 中的最后一个 block :

observeEvent(input$submit_input, {
print("Return input")
return(input$text_input)
})

当观察到 input$submit_input 时,如何让此应用按预期工作并返回 input$text_input

最佳答案

你已经很接近让它工作了。 Shiny 模块的诀窍在于将变量传入和传出它们需要将变量作为 react 值传递。我对您的代码做了两个小改动,以获得我认为您希望看到的内容。

首先是从服务器模块返回 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 的输出是响应式(Reactive)的。如果您想要值而不是函数内容,则需要使用 () 解析对象。因此,在您的服务器功能中:

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"

关于r - 如何在 R Shiny 应用程序中将变量从模块返回到服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50377627/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com