Таблица и рисунок перекрестной ссылки офицера R
Я хотел бы иметь возможность перекрестной ссылки на таблицу или рисунок в текстовом документе, используя пакет офицера R.
До сих пор я сталкивался с этими материалами, но у них, похоже, нет решения: https://davidgohel.github.io/officer/articles/word.html и подобный вопрос, добавьте заголовок к гибкий в docx
В обоих случаях я могу вставить заголовок только как заголовок уровня 2, а не как заголовок таблицы.
То, что я хочу сделать в Word, это Вставить -> Перекрестная ссылка и перейти к типу ссылки: Таблица и посмотреть мою подпись там. Прямо сейчас я вижу только заголовок под пронумерованным элементом.
Эта функция существует в офицере или где-либо еще?
2 ответа
Словом, номера таблиц используют { SEQ \\@ arabic }
паттерн, но ссылки на них используют { REF bookmark \h }
. Мы можем использовать это для создания нового кода, который может ссылаться на поле SEQ.
код:
ft <- regulartable(head(iris)) # create flextable
str <- paste0(' REF ft \\h ') # create string to be used as reference to future bookmark
doc <- read_docx() %>%
body_add_par('This is my caption' , style = 'Normal') %>% # add caption
slip_in_seqfield(str = "SEQ Table \\@ arabic",
style = 'Default Paragraph Font',
pos = "before") %>% # add number for table
body_bookmark('ft') %>% # add bookmark on the number
slip_in_text("Table ",
style = 'Default Paragraph Font',
pos = "before") %>% # add the word 'table'
body_add_flextable(value = ft, align = 'left') %>% # add flextable
body_add_break() %>% # insert a break (optional)
slip_in_text('As you can see in Table',
style = 'Default Paragraph Font',
pos = 'after') %>% # add the text you want before the table reference
slip_in_seqfield(str = str,
style = 'Default Paragraph Font',
pos = 'after') %>% # add the reference to the table you just added
slip_in_text(', there are a lot of iris flowers.',
style = 'Default Paragraph Font',
pos = 'after') %>% # add the rest of the text
print('Iris_test.docx') # print
Надеюсь это поможет:)
Для записи: теперь вы можете сделать это немного проще, используя некоторые вспомогательные функции из
{crosstable}
упаковка.
Отказ от ответственности: я разработчик этого пакета, и эти функции были очень вдохновлены ответом @morgan121. Спасибо, Морган!
Вот пример:
library(officer)
library(crosstable)
library(ggplot2)
options(crosstable_units="cm")
ft = regulartable(head(iris))
my_plot = ggplot(data = iris ) +
geom_point(mapping = aes(Sepal.Length, Petal.Length))
doc = read_docx() %>%
body_add_title("Dataset iris", 1) %>%
body_add_normal("Table \\@ref(table_iris) displays the 6 first rows of the iris dataset.") %>%
body_add_flextable(ft) %>%
body_add_table_legend("Iris head", bookmark="table_iris") %>%
body_add_normal("Let's add a figure as well. You can see in Figure \\@ref(fig_iris) that sepal length is somehow correlated with petal length.") %>%
body_add_figure_legend("Relation between Petal length and Sepal length", bookmark="fig_iris") %>%
body_add_gg2(my_plot, w=14, h=10, scale=1.5)
print(doc , 'Iris_test.docx')
Дополнительная информация на https://danchaltiel.github.io/crosstable/articles/crosstable-report.html .
Как и в случае с кодом morgan121, вам нужно выделить весь текст в MS Word и дважды нажать F9, чтобы числа обновились правильно.