R - knitr :: kable ("html) - имена столбцов из имен (список) - PullRequest
0 голосов
/ 04 ноября 2018

Я работаю над постом блога в 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 %>%, чтобы сделать мою цель более явной. Чтобы воспроизвести это, вам нужно запустить этот блок в 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))

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Мне нравится вышеупомянутое решение Эми, а также есть два других варианта, которые хорошо отображаются на веб-страницах, в том числе один из моего любимого пакета DT (намного больше вариантов в https://rstudio.github.io/DT/ - много пробелов на этом):

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

enter image description here

Вот еще один из flextable:

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

enter image description here

0 голосов
/ 05 ноября 2018

Так что я думаю, что вам нужен стол, похожий на (если нет, не стесняйтесь так говорить)

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