openxlsx :: writeFormula построчно - есть ли эффективный способ сделать это?

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

Есть ли эффективный способ записи формулы по строкам?

Проиллюстрируем проблему на воспроизводимом примере:

df <- data.frame(a = 1:3,
                 b = 4:6,
                 c = 7:9)

# create workbook, worksheet and write data to worksheet
wb <- createWorkbook()
addWorksheet(wb, "Sheet 1")
writeData(wb, "Sheet 1", x = df)

#  formula to be added rowwise to cells A5:C5
f <- c("SUM(A2:A4)", "SUM(B2:B4)", "SUM(C2:C4)")

# Using the openxlsx function results in columnwise addition of the formula vector: 
writeFormula(wb, sheet = 1, x = f, startCol = 1, startRow = 5)

saveWorkbook(wb, "rowwise_writeFormula.xlsx", overwrite = TRUE)

Это приводит к:

введите описание изображения здесь

writeFormula по строкам

Наивный подход состоит в том, чтобы добавлять каждую формулу по отдельности, что, возможно, подходит для небольших наборов данных.

writeFormula(wb, sheet = 1, x = "SUM(A2:A4)", startCol = 1, startRow = 5)
writeFormula(wb, sheet = 1, x = "SUM(B2:B4)", startCol = 2, startRow = 5)
writeFormula(wb, sheet = 1, x = "SUM(B2:B4)", startCol = 3, startRow = 5)

Это дает то, что я хочу, но не подходит для сотен столбцов.

Используя purrr :: pwalk, это можно заключить в функцию, что является улучшением:

formula_inputs <- list(formula = f,
                       start_col = 1:3,
                       start_row = rep(5, 3))

purrr::pwalk(formula_inputs, function(formula, start_col, start_row) writeFormula(wb, sheet = 1, x = formula, startCol = start_col, startRow = start_row))

В любом случае это делает то, что требуется:

введите описание изображения здесь

Мой вопрос: есть ли способ лучше? или это может быть улучшение openxlsx?

В моем реальном случае у меня есть 100 переменных для 10 фреймов данных в списке, каждая из которых требует нескольких (10) построчных формул для построения общей суммы. Всего нужно написать около 10 000 формул, это займет несколько минут; так что любые идеи о том, как ускорить процесс, будут приветствоваться.

Примечание: альтернативный подход openxlsx с использованием writeData для векторов класса «formula» также добавляет векторы как столбцы; когда я пытаюсь переставить векторы в строки, класс формулы теряется.


person Peter    schedule 15.08.2020    source источник
comment
Почему бы вам просто сначала f <- colSums(df), затем rbind f в df, а затем экспортировать в книгу?   -  person SteveM    schedule 15.08.2020
comment
Мне очень хотелось бы! но рабочая книга должна быть заполнена формулой, поскольку данные должны использоваться пользователями Excel, и они хотят изменить входные данные, чтобы увидеть влияние, которое это оказывает на итоги; Хотя для MRE я использовал sum (), в реальной книге есть более сложные формулы, которые показывают изменения, например, в инфляции. Рабочая книга должна быть динамичной / отзывчивой: итоги и промежуточные итоги должны реагировать на изменения ввода.   -  person Peter    schedule 15.08.2020
comment
Тогда мне кажется, что у вас должен быть шаблон книги со встроенными в него формулами, а затем записывать выходные данные r в копии шаблона. Есть смысл?   -  person SteveM    schedule 15.08.2020
comment
Это интересная идея, однако в реальном мире за пределами MRE каждый фрейм данных в списке имеет разное количество строк от десятков до тысяч, не только они меняются, но и количество строк, вероятно, изменится по мере того, как проект развивается. Поэтому я стремлюсь разработать решение, которое максимально запрограммировано и избегаю работы непосредственно в Excel.   -  person Peter    schedule 15.08.2020
comment
Я вижу с помощью openxlsx, что вы можете экспортировать в именованный регион, то есть в имя диапазона Excel. В этом случае, если вы создаете шаблоны с функциями, которые используют имена диапазонов, а не абсолютные ссылки на ячейки, вы можете экспортировать данные с разными измерениями в качестве имен, и при этом функции будут обрабатываться должным образом.   -  person SteveM    schedule 16.08.2020
comment
Я не уверен, что это возможно, вероятно, лучший доступный вариант - использовать apply family или purrr в соответствии с вашим подходом, описанным выше. Есть еще одно сообщение об этом здесь   -  person MKa    schedule 17.08.2020
comment
@Mka, спасибо, что указали на этот ответ: я пропустил его при первоначальном поиске. Я попробую: подход apply может быть быстрее, чем purrr   -  person Peter    schedule 17.08.2020