【问题标题】:R Shiny - Do I really need all these REACTIVE functions?R Shiny - 我真的需要所有这些 REACTIVE 功能吗?
【发布时间】:2018-11-20 00:24:46
【问题描述】:

我有一个用 R 语言开发的算法。假设它有 5000 行代码。现在我将它转换为一个 R Shiny 应用程序,但我可以让代码工作的唯一方法是在几乎 每一 行代码上放置一个 REACTIVE 函数。一定有更简单的方法!

这是一个高度简化的版本。这是ui.R代码:

library(shiny)

shinyUI(fluidPage(

  # application titles

  titlePanel("Calculate Next 3 Integers Above Specified Integer"),

  # sidebar panel

  sidebarLayout(
    sidebarPanel(numericInput("int", "Enter integer", value="")),

  # main output

    mainPanel(textOutput("int1"),
          textOutput("int2"),
          textOutput("int3"))
  )))

这里是 server.R 代码:

shinyServer(function(input, output){

  int <- reactive({as.numeric(input$int)})

  int1 = reactive({int() + 1})
  int2 = reactive({int() + 2})
  int3 = reactive({int() + 3})

  output$int1 <- renderText(int1())
  output$int2 <- renderText(int2())
  output$int3 <- renderText(int3())

  })

你看到我在哪里定义 int1、int2、int3 了吗?现在假设我在这之后有很多行代码使用 int1、int2 和 int3。每次我有使用 int1、int2 或 int3 的 R 编程语句时,我都必须使用反应函数。这在我当前的程序中意味着很多次。

有没有办法将所有这些代码放入某种类型的块中,自动将 REACTIVE 应用于块中的所有内容?所以每次它看到 int1()、int2() 或 int3() 时我不需要单独的 REACTIVE 函数?

【问题讨论】:

  • 5000 行很重要 - 您确定要将其转换为照原样闪亮吗?我可能会建议将您的代码构建为一个包并利用您的算法。但是有一个闪亮的应用程序需要等待很长时间才能生成结果,这可能不是一种有趣的用户体验。
  • 我不确定它是否有 5000 行。 :-) 但它是一种统计算法,可以模拟一组临床试验的各种设计元素。因此,研究设计、样本量限制、剂量组的替代数量以及许多其他输入有各种输入。然后,该算法根据用户输入的阈值来量化各种结果的概率。这就是基本的想法。但是有很多处理,然后返回给用户的输出。

标签: r shiny reactive


【解决方案1】:

您可以将多个反应性元素组合成一个大的反应性元素并将其呈现为输出。例如,在您的示例代码中,您可以执行以下操作:

output$new_output <- renderUI({
  str1 <- int1()
  str2 <- int2()
  str3 <- int3()
  HTML(paste(str1, str2, str3, sep = '<br/>'))
})

并使用 htmlOutput("new_output") 在 UI 中呈现它。同样,如果您有数据框或表格,则可以使用 rbind 或类似的东西将元素组合成更大的表格等。

【讨论】:

  • 好的,太好了。谢谢!对于我上面的小例子,我当然能够让它工作,所以我会看看我是否可以让它与我正在处理的更大的程序一起工作。
猜你喜欢
  • 2010-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-01
  • 2014-04-13
  • 2020-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多