【问题标题】:Create a reactive function outside the shiny app在闪亮的应用程序之外创建一个反应函数
【发布时间】:2019-06-13 21:54:23
【问题描述】:

我正在尝试分解我闪亮的应用程序的代码,以提高可读性并使用testthat 包测试一些功能。

我想要一些文件(例如server_utils.R),我可以在其中编写可以测试的“正常”函数,然后使它们具有反应性。

例如,我想在server_utils.R 中有这样的东西:

my_sum <- function(x, y) {
  x + y
}

以及应用中的类似内容:

my_sum_reactive(input$x, input$y)

你知道这样的行为是否可能吗?

【问题讨论】:

标签: r module shiny


【解决方案1】:

闪亮的模块可能会对您有所帮助。

请看这里:https://shiny.rstudio.com/articles/modules.html

正如您在文章中所读到的,如果您将输入包装在 reactive() 函数中,则可以实现传递输入所需的功能。 (请参阅文章“编写服务器函数”部分的末尾)。

您将定义my_sum 函数如下: (请注意,您必须使用变量 ab 作为反应变量 a()b() 并将结果包装在 reactive() 函数中。)

my_sum <- function(input, output, session, a, b) {
  reactive(as.numeric(a()) + as.numeric(b()))
}

并且可以将其用作:

my_sum_reactive <- callModule(my_sum, "id", reactive(input$a), reactive(input$b))

然后可以用作:

my_sum_reactive()

可重现的例子:

library(shiny)

my_sum <- function(input, output, session, a, b) {
  reactive(as.numeric(a()) + as.numeric(b()))
}

ui <- fluidPage({
  fluidRow(
    selectInput("a", "a", 1:3),
    selectInput("b", "b", 1:3),
    textOutput("txt")
  )
})

server <- function(input, output, session) {
  my_sum_reactive <- callModule(my_sum, "id", reactive(input$a), reactive(input$b))
  output$txt <- renderText(paste0("The sum is: ", my_sum_reactive())) 
}
shinyApp(ui, server)

【讨论】:

  • 这真的很有趣。我在想我也可以在服务器上做类似的事情:reactive(my_sum(input$x, input$y)。这应该仍然有效,但肯定不优雅。
  • 我要弄清楚它是否能解决我的问题。如果它成功了,我会接受答案。
猜你喜欢
  • 2019-06-16
  • 1970-01-01
  • 1970-01-01
  • 2019-05-02
  • 2017-06-08
  • 1970-01-01
  • 2017-03-10
  • 1970-01-01
  • 2017-07-27
相关资源
最近更新 更多