drake - отображает цели ggplot для их вывода - PullRequest
2 голосов
/ 27 марта 2019

Во-первых, drake просто волшебно.Мне нравится рабочий процесс разработки графа зависимостей, а затем его выполнения одним махом.

Однако я столкнулся с препятствием.

Мой рабочий процесс моделируется на больших сетках параметров, а затемсуммирование различных кусков указанной сетки.Я хотел бы создать сюжет для каждого такого среза.Если я правильно понимаю, я должен использовать некоторую форму cross->combine->map для достижения этого.

Вот что у меня есть:

sim_data <- function(mean, sd) {
  tibble(r = rnorm(1000, mean, sd))
}

plot_dis <- function(lg, title) {
  ggplot(lg) + 
    geom_histogram(aes(x=r, fill=sd), binwidth = 0.25) + 
    labs(title = str_glue("x = {title}")) +
    ggsave(str_glue("{title}.pdf")) # side-effect
}

plan <- drake_plan(
  data = target(
    sim_data(mean = x, sd = sd),
    transform = cross(x = c(10, 20, 30), sd = c(1, 2))
  ), # awesome
  s_x = target(
    bind_rows(data, .id = "sd"),
    transform = combine(data, .by=x)
  ), # great
  plot = target(
    plot_dis(s_x, x),
    transform = map(s_x)
  ) # how to add a `file_out` to this target?
)

Graph for reference

Так что моя цель plot имеет побочный эффект сохранения графика.Есть лучший способ сделать это?Как настоящий file_out для цели plot?

Спасибо.

1 Ответ

2 голосов
/ 27 марта 2019

Отличный вопрос.Размышление об этом на самом деле помогает мне решить некоторые проблемы с drake + keras.

Как добавить file_out() s

Вы почти у цели, все, что вам нужно, это немного аккуратнооценка (!!), чтобы убедиться, что каждое имя файла является литеральной строкой в ​​плане.

library(drake)
drake_plan(
  data = target(
    sim_data(mean = x, sd = sd),
    transform = cross(x = c(10, 20, 30), sd = c(1, 2))
  ),
  s_x = target(
    bind_rows(data, .id = "sd"),
    transform = combine(data, .by=x)
  ),
  plot = target(
    plot_dis(s_x, file_out(!!sprintf("%s.pdf", x))),
    transform = map(s_x)
  )
)
#> # A tibble: 12 x 2
#>    target      command                                    
#>    <chr>       <expr>                                     
#>  1 data_10_1   sim_data(mean = 10, sd = 1)                
#>  2 data_20_1   sim_data(mean = 20, sd = 1)                
#>  3 data_30_1   sim_data(mean = 30, sd = 1)                
#>  4 data_10_2   sim_data(mean = 10, sd = 2)                
#>  5 data_20_2   sim_data(mean = 20, sd = 2)                
#>  6 data_30_2   sim_data(mean = 30, sd = 2)                
#>  7 s_x_10      bind_rows(data_10_1, data_10_2, .id = "sd")
#>  8 s_x_20      bind_rows(data_20_1, data_20_2, .id = "sd")
#>  9 s_x_30      bind_rows(data_30_1, data_30_2, .id = "sd")
#> 10 plot_s_x_10 plot_dis(s_x_10, file_out("10.pdf"))       
#> 11 plot_s_x_20 plot_dis(s_x_20, file_out("20.pdf"))       
#> 12 plot_s_x_30 plot_dis(s_x_30, file_out("30.pdf"))

Создано в 2019-03-26 с помощью пакета Представить (v0.2.1)

И с немного большим количеством метапрограммирования вы можете вместо этого использовать целые имена цели.

library(drake)
drake_plan(
  data = target(
    sim_data(mean = x, sd = sd),
    transform = cross(x = c(10, 20, 30), sd = c(1, 2))
  ),
  s_x = target(
    bind_rows(data, .id = "sd"),
    transform = combine(data, .by=x)
  ),
  plot = target(
    plot_dis(s_x, file_out(!!sprintf("%s.pdf", deparse(substitute(s_x))))),
    transform = map(s_x)
  )
)
#> # A tibble: 12 x 2
#>    target      command                                    
#>    <chr>       <expr>                                     
#>  1 data_10_1   sim_data(mean = 10, sd = 1)                
#>  2 data_20_1   sim_data(mean = 20, sd = 1)                
#>  3 data_30_1   sim_data(mean = 30, sd = 1)                
#>  4 data_10_2   sim_data(mean = 10, sd = 2)                
#>  5 data_20_2   sim_data(mean = 20, sd = 2)                
#>  6 data_30_2   sim_data(mean = 30, sd = 2)                
#>  7 s_x_10      bind_rows(data_10_1, data_10_2, .id = "sd")
#>  8 s_x_20      bind_rows(data_20_1, data_20_2, .id = "sd")
#>  9 s_x_30      bind_rows(data_30_1, data_30_2, .id = "sd")
#> 10 plot_s_x_10 plot_dis(s_x_10, file_out("s_x_10.pdf"))   
#> 11 plot_s_x_20 plot_dis(s_x_20, file_out("s_x_20.pdf"))   
#> 12 plot_s_x_30 plot_dis(s_x_30, file_out("s_x_30.pdf"))

Создано в 2019-03-26 представьте пакет (v0.2.1)

Но вам действительно нужны файлы?

ggplot2 объекты хорошо воспроизводятся с кешем drake.

library(drake)
library(tidyverse)

sim_data <- function(mean, sd) {
  tibble(r = rnorm(1000, mean, sd))
}

plot_dis <- function(lg) {
  ggplot(lg) + 
    geom_histogram(aes(x=r, fill=sd), binwidth = 0.25) + 
    labs(title = deparse(substitute(lg)))
}

plan <- drake_plan(
  data = target(
    sim_data(mean = x, sd = sd),
    transform = cross(x = c(10, 20, 30), sd = c(1, 2))
  ),
  s_x = target(
    bind_rows(data, .id = "sd"),
    transform = combine(data, .by=x)
  ),
  plot = target(
    plot_dis(s_x),
    transform = map(s_x)
  )
)

make(plan)
#> target data_10_1
#> target data_10_2
#> target data_20_1
#> target data_20_2
#> target data_30_2
#> target data_30_1
#> target s_x_10
#> target s_x_20
#> target s_x_30
#> target plot_s_x_10
#> target plot_s_x_20
#> target plot_s_x_30

readd(plot_s_x_10) # see also loadd()

Создано в 2019-03-26 с помощью представительного пакета (v0.2.1)

...