Сократите количество раз, когда я вызываю функцию, зависящую от поля selectizeInput. - PullRequest
1 голос
/ 19 марта 2019

Я разработал небольшое блестящее приложение: Приложение

Приложение отображает дождь для станций, которые выбраны в 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 голосов
/ 20 марта 2019

У вас есть необходимый код. Везде, где вы хотите использовать результаты ввода $ var, вызовите DataInput (). Создав реактивную функцию dataInput, она будет вызываться при обновлении ввода $ 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

...