改进R-Shiny代码的建议(我应该在R-Shiny中运行两次代码以绘制不同的结果吗?)

时间:2019-02-17 09:46:23

标签: r shiny

我对R-Shiny相当陌生,我正尝试使用我在R-Shiny中用R编写的代码。由于代码最初是用R编写的,因此在R-Shiny中使用的语法面临很多困难。

我想知道是否有一种更有效的方法,不必重新编写整个代码即可得出不同的结果。

例如,我的R-Shiny的格式是这样的:

ui <- fluidPage(


#my input Buttons/sliders( ),

#output functions (I am using 3 outputs)

plotOutput("Hindcast"),
plotOutput("Histogram"),
plotOutput("Pval")

)

server<-function(input,output) {

output$Hindcast<-renderPlot({

#Here I write my code

plot(#required output for "Hindcast")

})

output$Histogram <- renderPlot({

#Here I am required to write most of the code again
#I tried using the reactive function, but the way my code is built, it would 
require too many reactive functions

plot...
})
output$Pval <- renderPlot({

#entire code again

plot...
}) 
shinyApp(ui=ui, server)

我应该在这里上传我的代码,但是它太长了,问题不在于编码,而在于语法。

帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

很难在没有实际代码的情况下明确注释,但这是一些有关反应式编程的良好资源的链接。

https://www.rstudio.com/resources/webinars/shiny-developer-conference/

前两个视频是金矿。


通常,您的应用程序中永远不应包含任何重复代码。而且我不明白为什么当原始应用程序具有重复代码时,为什么需要多个反应功能。

计划任何应用程序的第一步是要牢记(或在纸面上)存在的反应依赖性,即我的inputs所依赖的outputs是什么。

第二,考虑问题“所有地块共有什么代码?”。由于存在多个图,基本假设是必须进行某些更改才能生成不同的图。在此之前,我们先获取所有代码,然后将其称为“共享代码”。

最后,我们将前两点结合起来,以确保在不使用冗余代码的情况下保留依赖关系。

这是一个带有冗余代码的简单示例。

冗余代码

library(shiny)
library(dplyr)

data = mtcars

shinyApp(ui = {
  fluidPage(
    sliderInput("selectHP","Select Horse Power",min(data$hp),max(data$hp),data$hp),
    sliderInput("selectCyl","Select Cylinders",min(data$cyl),max(data$cyl),data$cyl),
    sliderInput("mpg","Select MPG Range",min(data$mpg),max(data$mpg),data$mpg),
    plotOutput("hp_mpg"),
    plotOutput("cyl_mpg")
  )
},
server = function(input,output){
  output$hp_mpg = renderPlot({

    #Shared Code
    data = data%>%
      filter(between(hp,input$selectHP[1],input$selectHP[2]))%>%
      filter(between(cyl,input$selectCyl[1],input$selectCyl[2]))%>%
      filter(between(mpg,input$mpg[1],input$mpg[2]))

    plot(data$hp,data$mpg)
  })

  output$cyl_mpg = renderPlot({

    #Shared Code
    data = data%>%
      filter(between(hp,input$selectHP[1],input$selectHP[2]))%>%
      filter(between(cyl,input$selectCyl[1],input$selectCyl[2]))%>%
      filter(between(mpg,input$mpg[1],input$mpg[2]))

    plot(data$hp,data$cyl)
  })
})

冗余已删除

library(shiny)
library(dplyr)

data = mtcars

shinyApp(ui = {
  fluidPage(
    sliderInput("selectHP","Select Horse Power",min(data$hp),max(data$hp),data$hp),
    sliderInput("selectCyl","Select Cylinders",min(data$cyl),max(data$cyl),data$cyl),
    sliderInput("mpg","Select MPG Range",min(data$mpg),max(data$mpg),data$mpg),
    plotOutput("hp_mpg"),
    plotOutput("cyl_mpg")
  )
},
server = function(input,output){


  data_reactive = reactive({
    data = data%>%
      filter(between(hp,input$selectHP[1],input$selectHP[2]))%>%
      filter(between(cyl,input$selectCyl[1],input$selectCyl[2]))%>%
      filter(between(mpg,input$mpg[1],input$mpg[2]))

    return(data)
  })

  output$hp_mpg = renderPlot({

    plot(data_reactive()$hp,data_reactive()$mpg)
  })

  output$cyl_mpg = renderPlot({

    plot(data_reactive()$hp,data_reactive()$cyl)
  })
})