Как эффективно выполнить проверку множества параметров для запуска сценария на R? - PullRequest
0 голосов
/ 22 сентября 2018

У меня есть скрипт на R, и он имеет 4 параметра, которые можно варьировать.Я хочу запустить цикл с несколькими комбинациями этих параметров, и время этих прогонов сравнить их потом.Примерно так:

dim_map = c(10,40,80,120)
epochs = c(200,600,1000)
dim_input = c(3,80,400,1000,3000)
datapoints = c(15000,50000,100000)
results = data.frame(dim_map = c(),
                     epochs = c(),
                     dim_input = c(),
                     datapoints = c(),
                     time = c()
)

for(dim in dim_map){
  for (epoch in epochs){
    for (m in dim_input){
      for (n in datapoints){

        t = Sys.time() # Start time

        ## Run some script

        elapsed_time = as.numeric(Sys.time() - t, units = 'secs')

        results[nrow(results)+1,] = c(dim, epoch, m, n, elapsed_time)
      }
    }
  }
}

Есть ли способ сделать это, избегая петель?Я чувствую, что эти вложенные циклы замедляют движение, но я не знаю, воображение ли это.Или, может быть, лучший способ рассчитать время выполнения сценария с этими изменениями параметров?

1 Ответ

0 голосов
/ 22 сентября 2018

Я думаю, что один из самых простых способов сделать это - объединить pmap и cross_df из purrr.Мы можем легко создать все комбинации параметров и затем запустить наш код для каждого из них, сохранив результаты в новом столбце:

library(tidyverse)

params <-  cross_df(list(
  dim_map = c(10,40,80,120),
  epochs = c(200,600,1000),
  dim_input = c(3,80,400,1000,3000),
  datapoints = c(15000,50000,100000)
))

timer <- function(dim_map, epochs, dim_input, datapoints){
  start_time = Sys.time()
  Sys.sleep(0.01) # your code to time here
  end_time = Sys.time()

  return(end_time - start_time)
}

params %>%
  mutate(time = pmap_dbl(., timer))
#> # A tibble: 180 x 5
#>    dim_map epochs dim_input datapoints   time
#>      <dbl>  <dbl>     <dbl>      <dbl>  <dbl>
#>  1      10    200         3      15000 0.0110
#>  2      40    200         3      15000 0.0110
#>  3      80    200         3      15000 0.0110
#>  4     120    200         3      15000 0.0110
#>  5      10    600         3      15000 0.0110
#>  6      40    600         3      15000 0.0110
#>  7      80    600         3      15000 0.0110
#>  8     120    600         3      15000 0.0109
#>  9      10   1000         3      15000 0.0110
#> 10      40   1000         3      15000 0.0110
#> # ... with 170 more rows

Создано в 2018-09-21 с помощью пакета представ. (v0.2.0).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...