我有一个在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函数吗?
答案 0 :(得分:2)
您可以将多个反应性元素组合成一个大的反应性元素,并将其呈现为输出。例如,在示例代码中,您可以执行以下操作:
output$new_output <- renderUI({
str1 <- int1()
str2 <- int2()
str3 <- int3()
HTML(paste(str1, str2, str3, sep = '<br/>'))
})
并使用htmlOutput("new_output")
在UI中呈现。同样,如果您有数据框或表,则可以使用rbind
或类似方法将元素组合成更大的表等。