2013-11-09 3 views
4

Когда я пытаюсь распечатать таблицу с knitr::kable Функция «id» word apperas в именах столбцов. Как я могу его изменить?Функция kable: «id» в столбцах

Пример:

> x <- structure(c(42.3076923076923, 53.8461538461538, 96.1538461538462, 
        2.56410256410256, 1.28205128205128, 3.84615384615385, 
        44.8717948717949, 55.1282051282051, 100), 
       .Dim = c(3L, 3L), 
       .Dimnames = structure(list(Condition1 = c("Yes", "No", "Sum"), 
              Condition2 = c("Yes", "No", "Sum")), 
       .Names = c("Condition1", "Condition2")), class = c("table", "matrix")) 
> print(x) 
      Condition2 
Condition1 Yes  No Sum 
     Yes 42,31 2,56 44,87 
     No 53,85 1,28 55,13 
     Sum 96,15 3,85 100,00 
> library(knitr) 
> kable(x) 
|id | Yes| No| Sum| 
|:----|-----:|-----:|------:| 
|Yes | 42,3| 2,56| 44,9| 
|No | 53,8| 1,28| 55,1| 
|Sum | 96,2| 3,85| 100,0| 

Edit: Я нахожу причину такого поведения в функции knitr:::kable_mark. Но теперь я не понимаю, как сделать его более гибким.

+0

Это тривиально, чтобы исправить в knitr; либо вопрос Github, либо запрос на тягу приветствуются, хотя сейчас это не нужно, поскольку я исправил его (скоро будет нажимать) –

+2

На Github сейчас: https://github.com/yihui/knitr –

+0

@Yihui Я думаю, что это будет будьте добры, чтобы это было ответом, поэтому OP может отметить это как принятое. –

ответ

1

Я думаю, что самый простой способ - вырвать и полностью заменить kable_mark. Примечание: это довольно грязно, но, похоже, он работает, и нет никакого способа настроить работу kable_mark (вы можете отправить патч для ножа).

km <- edit(knitr:::kable_mark) 
# Now edit the code and remove lines 7 and 8. 

unlockBinding('kable_mark', environment(knitr:::kable_mark)) 
assign('kable_mark', km, envir=environment(knitr:::kable_mark)) 

Пояснение: Сначала мы редактируем функцию и сохраняем измененное определение во временной переменной. Снимаем две линии

if (grepl("^\\s*$", cn[1L])) 
    cn[1L] = "id" 

... конечно, вы можете также жестко закодировать измененная функция, а не редактировать его, или изменить функцию вокруг полностью.

Далее мы используем unlockBinding, чтобы сделать knitr:::kable_mark overridable. Если мы этого не сделаем, следующая команда assign не будет работать.

Наконец, мы назначаем исправленную функцию обратно на knitr:::kable_mark. Готово.

+0

Спасибо. Я подумал о чем-то подобном. Но я хочу получить flixible аргумент как 'title' в функции' Hmisc :: latex'. –

+0

@unikum К сожалению, 'kable' и' kable_markdown' не передают никакие аргументы 'kable_mark', поэтому нет прямого способа сделать это настраиваемым. Конечно, вы могли бы заменить * все * эти функции, чтобы достичь этого, так же, как показано в моем ответе. В качестве альтернативы вы можете заменить строку '' id'' вызовом 'getOption' внутри' kable_mark' и установить нужное имя столбца с помощью опции (option) (...) '. Однако я бы не назвал это хорошим решением. –

+1

Как вы сказали, это грязно и должно быть последним средством после того, как автор пакета отказывается сотрудничать, что [редко бывает] (https://github.com/yihui/knitr/pulls?direction=desc&page= 1 & sort = created & state = closed) в разработке knitr :) –

2

Альтернатива kable может быть общий метод S3 из pander:

> library(pander) 
> pander(x, style = 'rmarkdown') 


| &nbsp; | Yes | No | Sum | 
|:---------:|:-----:|:-----:|:-----:| 
| **Yes** | 42.31 | 2.564 | 44.87 | 
| **No** | 53.85 | 1.282 | 55.13 | 
| **Sum** | 96.15 | 3.846 | 100 | 

Если вам необходимо установить десятичный знак в запятую, а затем установить соответствующую опцию перед и использовать это в вашей R сессии:

> panderOptions('decimal.mark', ',') 
> pander(x, style = 'rmarkdown') 


| &nbsp; | Yes | No | Sum | 
|:---------:|:-----:|:-----:|:-----:| 
| **Yes** | 42,31 | 2,564 | 44,87 | 
| **No** | 53,85 | 1,282 | 55,13 | 
| **Sum** | 96,15 | 3,846 | 100 | 

есть также некоторые другие возможные хитрости: http://rapporter.github.io/pander/#pander-options

+0

'pander' является хорошей альтернативой для этого простого примера. –

Смежные вопросы