【问题标题】:R: loop inside kable with pipe while also piping output to next step (group_rows)R:使用管道在 kable 内循环,同时将输出管道传输到下一步(group_rows)
【发布时间】:2019-03-15 04:38:56
【问题描述】:

我正在使用kable 并为大约 500 个数据集创建表,因此我正在尝试创建一个脚本并对其进行循环。我难倒我的一件事是我正在使用group_rows 选项,尽管组的数量会在数据集之间发生变化。如何设置一个 R 脚本来考虑这一点。

这是我的脚本,目前在 kable 命令中使用正常循环,但该循环不起作用...

[数据集grps是确定组的预定义标准]

对于下面的代码,grpscolor 数据集如下。他们根本没有连接到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()

这样,它没有创建任何组。我很好奇是否有其他选择可以尝试?

谢谢

【问题讨论】:

  • 你能提供一个完全可重现的例子吗?目前我希望这不起作用,因为for-loop 没有连接到 mtcars-table....
  • 已更新以包含 colorgrps 数据集的示例。他们当前未连接到mtcars。不过,我认为他们应该是?
  • 复制并粘贴在我的部分......在我的实际脚本中一切正常。
  • 尝试仍然使用for 循环的非管道解决方案(即,将每个管道分解为自己的 obj &lt;- ... 行并将结果传递到下一行)。
  • 要清楚,您建议在kable 之外创建一个循环,在其中我为每个可能的 group_row 创建一个对象?如果是这样,之后我将如何将它们全部连接在一起?我需要创建一个列表或类似的东西吗?

标签: r loops pipe kable


【解决方案1】:

考虑一个非管道解决方案:

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

【讨论】:

  • 哇,这似乎很容易。奇怪的是,如果我做了类似的事情,比如说,但这次使用cell_spec,这需要以不同的方式完成,因为每列只允许一个cell_spec。反正我相信但是,我想为每个单元格着色由另一个变量定义的不同颜色。我尝试了ifelse 声明,但没有成功。
  • 这听起来你需要问一个不同的问题。这里的解决方案对您有用吗?
  • 是的,确实如此。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-13
相关资源
最近更新 更多