Специалист по перекрестным ссылкам на таблицы и рисунки R

Я хотел бы иметь возможность делать перекрестные ссылки на таблицу или рисунок в текстовом документе с помощью пакета офицера R.

Я пока сталкивался с этими материалами, но, похоже, у них нет решения: https://davidgohel.github.io/officer/articles/word.html#table-and-image-captions и аналогичный вопрос добавить подпись к flextable в docx

В обоих случаях я могу вставить заголовок только как заголовок уровня 2, а не как настоящий заголовок таблицы.

Что я хочу сделать в Word, так это Вставить -> Перекрестная ссылка и перейти к Типу ссылки: Таблица и увидеть там мою подпись. Сейчас я вижу только подпись под пронумерованным элементом.

Есть ли эта функция в офицере или где-нибудь еще?


person Jordan Hackett    schedule 20.09.2018    source источник
comment
Вы когда-нибудь находили решение? Я бы тоже хотел эту функцию   -  person morgan121    schedule 17.04.2019


Ответы (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

Надеюсь это поможет :)

person morgan121    schedule 17.04.2019
comment
Огромное спасибо! До сих пор я не нашел ответа. Кажется, это помогает :)! - person Jordan Hackett; 22.04.2019
comment
Я могу заставить это работать, если меня интересует только печать таблицы в одном документе Word, но как мне адаптировать это для работы в гораздо большем файле Rmd? Если я удалю 'Iris_test.docx', я могу заставить его распечатать в Rmd-связанном словесном документе, но вывод таблицы, который я получаю, представляет собой беспорядочный беспорядок внутренней структуры таблицы. - person Dylan_Gomes; 25.02.2020
comment
честно говоря, у меня никогда не было таблиц для печати в Rmarkdown to word. Для меня они всегда беспорядок :( Если вы найдете решение, вы можете опубликовать его здесь или отредактировать мой ответ и добавить его? - person morgan121; 25.02.2020
comment
Спасибо! Есть ли для этого chunk / officedown версия? - person Paul Schmidt; 26.07.2021

Для записи: теперь вы можете сделать это немного проще, используя некоторые вспомогательные функции из пакета {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, чтобы числа обновились правильно.

person Dan Chaltiel    schedule 18.03.2021