Вложенный l oop в R для последовательности по всем комбинациям параметров - PullRequest
1 голос
/ 28 марта 2020

У меня есть следующие три параметра:

a <- c("brown", "red", "purple", "yellow", "blue", "green")
b <- c("unknown", "medium", "low", "high")
c <- c("group1", "group2")

Я хочу провести l oop через каждую комбинацию параметров, чтобы получить список имен этих самых параметров. Результат должен выглядеть следующим образом:

$plot_group1_unknown_brown
[1] "plot_group1_unknown_brown"

$plot_group2_unknown_brown
[1] "plot_group2_unknown_brown"

$plot_group1_medium_brown
[1] "plot_group1_medium_brown"

$plot_group2_medium_brown
[1] "plot_group2_medium_brown"

$plot_group1_low_brown
[1] "plot_group1_low_brown"
.
.
.

Теперь я хочу добиться этого, используя любое из функций семейства apply или действительно любой подход, кроме a для l oop. Я могу выполнить sh это с помощью для l oop примерно так:

for (x in a) { 
  for (a in b) { 
    for (i in c) { 

      plot_name <- paste( 'plot', i, a, x, sep = '_' )
      plot_list[[plot_name]] <- plot_name

    }
  }
}

Я также хотел бы отметить, что это всего лишь пример. В моем реальном случае использования plot_name (на RHS) будет функцией, которая принимает те же параметры, что и те, которые используются внутри функции paste() над ней. Что-то вроде plot_list[[plot_name]] <- some_plotting_function(x, i, a), и результатом будет список объектов ggplot2.

Ответы [ 2 ]

1 голос
/ 28 марта 2020

Вы можете использовать expand.grid, чтобы получить все возможные комбинации, а затем использовать apply по строкам, чтобы передать параметры в функцию.

complete_list <- expand.grid(c, b, a)
#Can also use cross_df from purrr
#complete_list <- purrr::cross_df(list(c = c, b = b, a = a))
apply(complete_list, 1, function(x) some_plotting_function(x[1], x[2], x[3]))
1 голос
/ 28 марта 2020

Мы можем использовать expand.grid на vector с и paste

v1 <- paste0('plot_', do.call(paste, c(expand.grid(c, b, a), sep="_")))
lst1 <- setNames(as.list(v1), v1)
head(lst1)
#$plot_group1_unknown_brown
#[1] "plot_group1_unknown_brown"

#$plot_group2_unknown_brown
#[1] "plot_group2_unknown_brown"

#$plot_group1_medium_brown
#[1] "plot_group1_medium_brown"

#$plot_group2_medium_brown
#[1] "plot_group2_medium_brown"

#$plot_group1_low_brown
#[1] "plot_group1_low_brown"

#$plot_group2_low_brown
#[1] "plot_group2_low_brown"
...