【问题标题】:R - knitr::kable("html) - col.names from names(list)R - knitr::kable("html) - col.names from names(list)
【发布时间】:2019-04-08 04:21:23
【问题描述】:

我正在 RStudio 中撰写博客文章。在某一时刻,块输出是一个带有命名数字向量的命名列表,结构如下:

object <- list("Name One" = c("A" = 1, "B" = 1), "Name two" = c("C" = 2, "D" = 2))

我想做的是使用:

object %>% 
    knitr::kable("html", col.names = X)

在漂亮的 HTML 表格中呈现输出。本例中渲染的col.names应该是"Name One""Name Two"

当然,像col.names = names(object) 这样的方式就完美了!

这是我收到的错误消息

Error in dimnames(x) <- dn : length of 'dimnames' [2] not equal to array extent

我了解每个列标题都呈现为:

<tr>
  <th style="text-align:left;">   </th>
  <th style="text-align:right;"> x </th>
</tr>

注意第一个空单元格。

每个命名的数字列都被呈现为:

<tr>
  <td style="text-align:left;"> A </td>
  <td style="text-align:right;"> 1 </td>
</tr>
<tr>
  <td style="text-align:left;"> B </td>
  <td style="text-align:right;"> 1 </td>
</tr>

我尝试过使用矢量c("Name One","name Two")、矢量c("Name One","n","Name Two","n"),以及各种seq()rep() 组合,但均未成功。

这里有一个更现实的例子 期待任何整洁的提示。

编辑:我刚刚添加了object %&gt;% 以使我的目标更加明确。为了重现这个,你需要在 R Markdown / Notebook 中运行这个块:

object <- list("Name One" = c("A" = 1, "B" = 1), "Name two" = c("C" = 2, "D" = 2))
# cf. names(object)
object %>% 
    knitr::kable("html", col.names = names(object))

【问题讨论】:

  • 我不太明白你想要的最终输出是什么。为什么不将列表转换为您想要的格式的 data.frame?
  • 感谢您的提示。我刚刚更新了我的帖子并使我的目标更加明确。下面的块可在 .Rmd 中重现

标签: r knitr blogdown kable


【解决方案1】:

我喜欢上面 Emi 的解决方案,还有其他两个选项可以很好地在网页上呈现,包括我最喜欢的 DT 包中的一个(https://rstudio.github.io/DT/ 有更多选项 - 这个有很多空白):

library(DT)
data.frame(as.vector(object)) %>% 
    datatable(options=list(dom='t'),colnames=names(object))

这是来自flextable的另一个:

library(flextable)
data.frame(as.vector(object)) %>% 
    regulartable() %>% set_header_labels(names(object))

【讨论】:

    【解决方案2】:

    所以我的猜测是你想要一个像这样的表(如果没有,请随意这么说)

    <table>
     <thead>
      <tr>
       <th style="text-align:left;"> Name.one </th>
       <th style="text-align:right;"> Name.two </th>
      </tr>
     </thead>
    <tbody>
      <tr>
       <td style="text-align:left;"> A </td>
       <td style="text-align:right;"> 1 </td>
      </tr>
      <tr>
       <td style="text-align:left;"> B </td>
       <td style="text-align:right;"> 2 </td>
      </tr>
    </tbody>
    </table>

    为此,如果您有data.frame(或tibble)格式,您可以通过以下方式生成它:

    data.frame("Name one"=c("A","B"), "Name two"=c(1, 2)) %>% kable(format="html")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-13
      • 2017-01-08
      • 1970-01-01
      • 2018-04-20
      • 2016-01-27
      • 2018-10-20
      • 2021-10-04
      • 1970-01-01
      相关资源
      最近更新 更多