Как вернуть переменную из модуля на сервер в приложении R Shiny? - PullRequest
0 голосов
/ 16 мая 2018

У меня возникают удивительные трудности с возвратом переменной из модуля на сервер в приложении R Shiny.В модуле я хотел бы вернуть значение, когда наблюдается нажатие кнопки, поэтому я обернул оператор return() в блок внутри observeEvent().Однако требуемое значение не возвращается, кажется, что весь блок observeEvent() имеет вид.

Я попытался создать минимальный рабочий пример, описывающий проблему ниже:

ui.R

# ui.R

fluidPage(
  input_module_ui("input"),
  actionButton("print_input_button",
               label = "Print Input")
)

server.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")

input.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)
  })

}

При тестировании этого приложения яввел «тест» в поле ввода текста и представил мой ввод.Однако, когда я попытался напечатать свой ввод, вместо того чтобы печатать «тест», как я ожидал, было напечатано следующее:

<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?

1 Ответ

0 голосов
/ 16 мая 2018

Вы были достаточно близки к тому, чтобы заставить это работать. Хитрость с блестящими модулями заключается в том, что для передачи переменных в них и из них необходимо передавать переменные как реактивные значения. Я сделал два небольших изменения в вашем коде, чтобы получить то, что, я думаю, вы надеетесь увидеть.

Сначала нужно было вернуть реактивную версию 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...