Как перекрестные ссылки на таблицы и графики в rmarkdown? - PullRequest
0 голосов
/ 23 сентября 2018

Я использую следующий шаблон

---
title: "Nice try buddy"
author: "SpaceMan"
date: "13 December 2057"
output:
  bookdown::pdf_document2
header-includes:
- \usepackage{booktabs}
- \usepackage{longtable}
- \usepackage{array}
- \usepackage{multirow}
- \usepackage[table]{xcolor}
- \usepackage{wrapfig}
- \usepackage{float}
- \usepackage{colortbl}
- \usepackage{pdflscape}
- \usepackage{tabu}
- \usepackage{threeparttable}
- \usepackage{threeparttablex}
- \usepackage[normalem]{ulem}
- \usepackage{makecell}  
---
---
references:
- id: fenner2012a
  title: One-click science marketing
  container-title: Nature Materials
  volume: 11
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

## Title

\begin{equation}
f\left(k\right)=\binom{n}{k}p^k\left(1-p\right)^{n-k} \label{eq:binom}
\end{equation}

You may refer to it using `\@ref(eq:binom)`, e.g., see Equation \@ref(eq:binom).
and not a nice citation! @fenner2012a


## Including Tables

You can also embed tables, for example:  \@ref(tab:tw)

```{r tw, echo=FALSE}
mytable
```

## References

, где mytable хранится в сеансе R и генерируется с

mytable <- head(cars) %>% kable(format = "latex", 
                                booktabs = T, 
                                caption = "Demo Table", 
                                escape = F) %>%
kable_styling(latex_options = 'HOLD_position')

Теперь это должно работать, но когдаЯ вяжу документ, используя

rmarkdown::render('C:\\Users\\john\\Documents\\bbv.Rmd')

  • cross-reference для таблицы не существует!Я вижу только ??
  • , а в таблице есть эта странная #tab вещь - как от нее избавиться?
  • TOC здесь, хотя я не просил об этом

enter image description here

Есть идеи, как решить эти проблемы?Спасибо!

РЕДАКТИРОВАТЬ: странная #tab вещь исчезла после перезагрузки.

1 Ответ

0 голосов
/ 23 сентября 2018

Проблема в том, что вы работаете против намерений kable, используя его вне блока R:

Функция kable() автоматически сгенерирует метку для табличной среды,это префикс tab: плюс метка чанка.

https://bookdown.org/yihui/bookdown/tables.html

Таким образом, следующий обходной путь определенно на хакерской стороне.Используя файл foo.Rmd с

---
output:
  bookdown::pdf_document2:
    toc: no
header-includes:
- \usepackage{float}
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```


## Including Tables

You can also embed tables, for example:  \@ref(tab:tw)

```{r tw, echo=FALSE}
mytable
```

You can also embed tables, for example:  \@ref(tab:tw2)

```{r tw2, echo=FALSE}
mytable2
```

Referencing images is easier: \@ref(fig:plt)

```{r plt, echo=FALSE, fig.cap = 'hello', fig.height=3} 
myplot 
``` 

, этот файл можно обработать вторым файлом foo.R:

library(knitr)
library(kableExtra)
# add the label to the options that would normally be populated from the chunk options
opts_current$append(list(label = "tw"))
mytable <- head(cars) %>% kable(format = "latex", 
                                booktabs = T, 
                                caption = "Demo Table", 
                                escape = F) %>%
  kable_styling(latex_options = 'HOLD_position')
opts_current$restore()

opts_current$append(list(label = "tw2"))
mytable2 <- tail(cars) %>% kable(format = "latex", 
                                booktabs = T, 
                                caption = "Demo Table", 
                                escape = F) %>%
  kable_styling(latex_options = 'HOLD_position')
opts_current$restore()

myplot <- ggplot(cars, aes(x = dist, y = speed)) + geom_point()

rmarkdown::render("foo.Rmd")

В принципе, эти команды можно выполнять также только наR подсказка, но я стараюсь не использовать подсказку напрямую.Кстати, я не получаю вывод (#tab) с вашим кодом.

Тем не менее, я думаю, что имеет смысл не работать против действий kable.Я могу понять, что может иметь смысл отделить манипулирование данными для презентации.Однако создание таблицы - это презентация с моей точки зрения.Таким образом, вместо создания таблицы извне, я бы просто создал данные извне.Чтобы сделать это конкретнее, давайте используем файл bar.Rmd:

---
output:
  bookdown::pdf_document2:
    toc: no
header-includes:
- \usepackage{float}
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
library(kableExtra)
```

## Including Tables

You can also embed tables, for example:  \@ref(tab:tw)

```{r tw, echo=FALSE}
mydata %>% kable(format = "latex", 
                 booktabs = T, 
                 caption = "Demo Table", 
                 escape = F) %>%
  kable_styling(latex_options = 'HOLD_position')
```

вместе с файлом bar.R:

# insert data processing here
mydata <- head(cars)
rmarkdown::render("bar.Rmd")

Это дает мне тот же вывод, и обработка данных(изначально!) отдельно от презентации.

...