Переносимое добавление данных R в листы Excel (без перезаписи)

Фон

Я пишу .R скрипт на своем компьютере (Windows), который (1) должен хранить Log.xlsx файл, записывающий данные о его запусках; и (2) будет запускаться коллегой на отдельной виртуальной машине (также Windows).

Требования

Я ищу пакет в R, который (1) позволит мне добавлять данные R (из data.frame) сразу после последней непустой строки на существующем листе в этой существующей рабочей книге Log.xlsx; в то время как (2) остается легко переносимым, так что любые необходимые пакеты могут быть автоматически установлены самим сценарием (через pacman::p_load()*), если они еще не установлены на виртуальной машине.

* Я обеспечиваю наличие pacman с помощью base функционала:

if(!"pacman" %in% installed.packages()) {
    install.packages("pacman")
}

Настройки

Поскольку этот журнал будет быстро расти — скрипт запускается ежедневно и будет регистрировать многие десятки записей за один запуск — я бы предпочел избегать подхода, предложенного здесь, который просто загружает все существующие данные рабочего листа в R, где он объединяет наборы данных, а затем (поверх) записывает результат в виде нового файла .xlsx (или .csv). Я также предпочел бы избежать (лучшего?) подхода, предложенного здесь, который аналогичным образом загружает и объединяет все в R, но затем перезаписывает лист внутри рабочей книги, а не перезаписывать саму книгу.

Короче говоря, я настоятельно предпочитаю гранулированную возможность добавления, чтобы просто добавлять новые данные в конец существующего листа без необходимости загружать, объединять и (перезаписывать) данные всего листа (не говоря уже о рабочей книге) в R.

Блокпост

Я исследовал пакеты xlsx, openxlsx (которые, кажется, имеют некоторые проблемы со стабильностью) и XLConnect. Хотя XLConnect кажется особенно актуальным (см. XLConnect::appendWorksheet()) и переносимым даже между операционными систем остается проблема Java. На данный момент pacman::p_load() успешно установит XLConnect и xlsx (среди прочих), однако любая попытка загрузить эти два пакета (через library()) предсказуемо приведет к

Error: package or namespace load failed for ‘xlsx’:
 .onLoad failed in loadNamespace() for 'rJava', details:
  call: fun(libname, pkgname)
  error: JAVA_HOME cannot be determined from the Registry

Очевидно, я мог бы исправить эту проблему на моем компьютере, следуя инструкциям здесь для установки версии Java (32- или 64-разрядной), совместимой с моей версией R. Однако я хотел бы, чтобы сценарий был самостоятельным, например что он обрабатывает свои собственные зависимости и безболезненно работает на виртуальной машине, независимо от того, какие битовые версии R и Java установлены на виртуальной машине. В частности, я не хочу заставлять своего коллегу вручную устанавливать соответствующую версию Java.

В заключение

В то время как второе решение (которое, очевидно, позволяет избежать контрольно-пропускного пункта Java) подойдет в крайнем случае, любая помощь в достижении моего списка Предпочтения будут очень признательны!


person Greg    schedule 02.06.2021    source источник
comment
Нужно ли хранить журнал в файле xlsx? Вы можете использовать fwrite в data.table, который может добавляться к существующему файлу, но сохраняется как текстовый файл.   -  person MKa    schedule 04.06.2021
comment
Спасибо, @МКа. Причина, по которой я склоняюсь к .xlsx (или электронной таблице в целом), заключается в том, что мне нужно хранить табличные данные, возможно, о различных объектах. Вкладки Excel (листы в рабочих книгах) позволяют гибко хранить таблицы нескольких сущностей в одном центральном журнале. Кроме того, в Excel не используются разделители символов, и я хочу полностью избежать возможных конфликтов между моими текстовыми данными и разделителями в таких форматах, как .csv.   -  person Greg    schedule 04.06.2021
comment
Я понимаю - я не уверен в опции .xlsx, но записываю их в базу данных, например. SQLite и поместить каждую вкладку в отдельную таблицу тоже может быть вариантом.   -  person MKa    schedule 07.06.2021
comment
Привет @МКа! Сначала я думал о БД, но понял, что это загонит меня в угол. Если БД размещается локально на той же машине, на которой выполняется скрипт, то переносимость становится еще большей проблемой: вместо того, чтобы просто вручную проверять, что совместимые битовые версии R и Java установлены на виртуальной машине, теперь я должен реплицировать пользовательский БД на этой виртуальной машине... все от имени моего коллеги. Если вместо этого я создам эту базу данных на серверах компании, мне придется ввести еще одно соединение с БД как потенциальный источник ошибки, когда отказ от записи одной записи в журнал может нарушить согласованность моих результатов.   -  person Greg    schedule 07.06.2021
comment
Хммм... Я только что понял, что если мне можно обойти разделители символов, я мог бы создать подкаталог /Log (а не файл Log.xlsx) прямо рядом со сценарием, и внутри этого подкаталога я мог бы иметь один текстовый файл (например, .csv) для каждого листа, который был бы в файле .xlsx. Затем записи (строки текста) можно было бы итеративно добавлять к каждому листу (текстовому файлу) в книге (подкаталоге) без необходимости загружать всю книгу Excel (или любой другой файл) в R, а затем переписывать ее, чтобы включить новые строки. . Это будет поддерживать табличные журналы локально и переносимо.   -  person Greg    schedule 07.06.2021