R Shiny-我真的需要所有这些REACTIVE功能吗?

时间:2018-11-20 00:24:47

标签: r shiny reactive

我有一个在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"))
  )))

这是服务器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函数吗?

1 个答案:

答案 0 :(得分:2)

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

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

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