R: цикл внутри кабеля с трубой, одновременно передавая вывод на следующий шаг (group_rows)

#r #loops #pipe #kable

#r #циклы #труба #кабель

Вопрос:

Я использую kable и завершаю таблицы примерно для 500 наборов данных, поэтому я пытаюсь создать один скрипт и выполнить цикл над ним. Одна вещь, которая ставит меня в тупик, это то, что я использую group_rows опцию, хотя количество групп будет меняться между наборами данных. Как можно настроить R-скрипт, чтобы учесть это.

Вот мой скрипт, в настоящее время использующий обычный цикл внутри kable команды, который не работает…

[набор данных grps является предопределенным критерием для определения групп]

Для приведенного ниже кода, grps amp; color datasets приведены ниже. Они вообще не подключены к mtcars :

 grps <- 
structure(list(no.cars = c(2,1,2), maincars = c("Mazda", 
"Datsun", "Hornet"), start = c(1, 3, 4),
 end = c(2L, 3L, 5L)), .Names = c("no.cars", "maincars", 
"start", "end"), row.names = c(NA, -3L), class = "data.frame")

color <- structure(list(color=c("#20324C", "#D2A8A4", "#FFC65A")),.Names = c("color"), row.names = c(NA, 
-3L), class = "data.frame")

mtcars[1:5,] %>% 
    knitr::kable(format="html")%>% 
    kable_styling("striped", full_width = F) %>%
    for(g in 1:nrow(grps)){
        group_rows(grps$maincars[g], grps$start[g], grps$end[g],label_row_css = paste0("background-color: ",color[g,1],"; color: #F1F1F1;")) %>% .()
    } %>% as_image()
  

При этом не было создано никаких групп. Мне любопытно, есть ли другой вариант, который я мог бы попробовать?

Спасибо

Комментарии:

1. Можете ли вы предоставить полностью воспроизводимый пример? На данный момент я бы ожидал, что это не сработает, поскольку for -loop не подключен к mtcars-table….

2. Обновлено, чтобы включить примеры color и grps наборов данных. В данный момент они не подключены к mtcars . Хотя, я полагаю, они должны быть?

3. Скопируйте и вставьте с моей стороны …. все в порядке в моем реальном скрипте.

4. Попробуйте нестандартное решение, все еще используя for цикл (т. Е. разбейте каждый канал на отдельные obj <- ... строки и передайте результат в следующую строку).

5. Чтобы было ясно, вы предлагаете создать цикл вне kable , в котором я создаю объект для каждого возможного group_row? Если да, то как бы я собрал их все вместе после? Нужно ли мне создавать список или что-то подобное?

Ответ №1:

Рассмотрим решение, не связанное с pipe:

 sub <- mtcars[1:5,]
sub <- knitr::kable(sub, format="html")
sub <- kable_styling(sub, "striped", full_width = FALSE) 

for(g in 1:nrow(grps)){
   sub <- group_rows(sub, grps$maincars[g], grps$start[g], grps$end[g],
                     label_row_css = paste0("background-color: ", color[g,1],
                                            "; color: #F1F1F1;")
                    )
}

as_image(sub)
  

В качестве альтернативы использованию pipelines, включите пользовательский метод:

 run_group_rows <- function(x){
    for(g in 1:nrow(grps)){
       x <- group_rows(x, grps$maincars[g], grps$start[g], grps$end[g],
                         label_row_css = paste0("background-color: ", color[g,1],
                                                "; color: #F1F1F1;")
                       )
    }
    return(x)
}

mtcars[1:5,] %>% 
    knitr::kable(format="html")%>% 
    kable_styling("striped", full_width = FALSE) %>%
    run_group_rows() %>% 
    as_image()
  

Комментарии:

1. Вау, это кажется таким простым. Любопытно, что, скажем, если бы я сделал нечто подобное, но на этот раз с использованием cell_spec , это нужно было бы сделать по-другому, поскольку для каждого столбца допускается только один cell_spec . Я верю, во всяком случае. Однако я хочу раскрасить каждую ячейку другим цветом, определяемым другой переменной. Я попробовал ifelse инструкцию, но у меня не получилось, чтобы это сработало.

2. Похоже, вам нужно задать другой вопрос. Сработало ли решение здесь для вас?

3. Да, это произошло. Спасибо