R: цикл внутри kable с pipe, а также передача вывода на следующий шаг (group_rows) - PullRequest
1 голос
/ 15 марта 2019

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

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

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

Для приведенного ниже кода наборы данных grps & color находятся ниже. Они вообще не связаны с 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 Ответ

0 голосов
/ 16 марта 2019

Рассмотрим решение, не относящееся к трубе:

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)

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

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()
...