减少我调用依赖于selectizeInput框的函数的次数

时间:2019-03-19 17:30:46

标签: r shiny plotly

我开发了一个闪亮的小应用程序: app

应用程序绘制在selectizeInput中选择的电台的降雨情况。 每次添加或删除工作站时,都会将数据发送到外部服务器。

目前,它将从外部服务器获取所有工作站的数据,无论它们是否保留在列表中。这增加了不必要的时间和计算量。 我的问题是如何减少获取已经存在的数据的需求?

因为我不能展示真实的应用程序,所以我创建了一个可再现的应用程序来说明我的代码流程:

#data
id <- as.numeric(1:26)
names(id) <- letters

#dataframe function
get.rain.data <- function(id){
  print(id)
  vec <- 1:100
  id <- as.numeric(id)
  print(id)
  df <- do.call(rbind,lapply(id,function(i)
    tibble(x=vec,y=vec*i+vec^2*i,
    id=as.factor(rep(i,length(vec))))))
  return(df)
}

#plot function
plot.rain <- function(df){
  print(df)
  p <- ggplot(df,aes(x=x,y=y,group=id))+
    geom_line(aes(color=id),size=0.6)
  ggplotly(p,height=700)
}


#### UI
ui <- fluidPage(
  titlePanel(h1("Rain Intensities and Cumulative Rain")),
  sidebarLayout(
    sidebarPanel(
      helpText("Check rain with info from
               IMS.gov.il"),
      selectizeInput("var", h3("Select station"), 
                     choices = id,
                     multiple = T,
                     selected = 4)
    ),
    mainPanel(
      plotlyOutput("rain")
    )
  )
)


# Define server logic ----
server <- function(input, output) {

  dataInput <- reactive({
    get.rain.data(input$var)
  })

  output$rain <- renderPlotly({
    req(input$var)
    plot.rain(dataInput())
  })
}

# Run the application 
shinyApp(ui = ui, server = server)

1 个答案:

答案 0 :(得分:0)

您具有所需的代码。您要在所有要使用input $ var的结果的地方调用DataInput()。通过创建反应性dataInput函数,将在input $ var更新时调用

# Define server logic ----
server <- function(input, output) {

  dataInput <- reactive({
    get.rain.data(input$var)
  })

  output$rain <- renderPlotly({
    plot.rain(dataInput())
  })
}

我认为您需要缓存值,以便仅查询一次。您可能需要查看备忘录包,它可以自动为您完成此操作。

https://github.com/r-lib/memoise