Очень простой вопрос:
Я пишу и запускаю свои скрипты R с помощью текстового редактора для создания их восстанавливаемыми, как был предложен несколькими членами ТАК.
Этот подход работает очень хорошо на меня, но я иногда должен выполнять дорогие операции (например. read.csv
или reshape
на базах данных 2M-строки), что я должен кэшироваться в среде R, а не повторно выполниться каждый раз, я запускаю скрипт (который является обычно много раз, в то время как я прогрессирую и тестирую новые строки кода).
Существует ли способ кэшировать то, что сценарий приводит в порядок до определенного момента так каждый раз, когда я только выполняю возрастающие строки кода (как я сделал бы путем выполнения R в интерактивном режиме)?
Спасибо.
## load the file from disk only if it
## hasn't already been read into a variable
if(!(exists("mytable")){
mytable=read.csv(...)
}
Edit: исправлена опечатка - спасибо Дирку.
Некоторые простые способы можно выполнить с помощью некоторых комбинаций
exists("foo")
для проверки существования переменной, иначе повторная загрузка или повторный расчетfile.info("foo.Rd")$ctime
, который вы можете сравнить с Sys.time()
и посмотреть, если он новее, чем заданное количество времени, вы можете загружать, иначе повторный расчет. На CRAN также есть пакеты кэширования, которые могут быть полезны.
После того как вы сделаете что-то, что, как вы обнаружили, требует больших затрат, сохраните результаты этого затратного шага в файле данных R.
Например, если вы загрузили csv во фрейм данных под названием myVeryLargeDataFrame
, а затем создали сводную статистику из этого фрейма данных в df под названием VLDFSummary
, вы можете сделать следующее:
save(c(myVeryLargeDataFrame, VLDFSummary),
file="~/myProject/cachedData/VLDF.RData",
compress="bzip2")
Опция compress здесь необязательна и должна использоваться, если вы хотите сжать файл, записываемый на диск. Подробнее см. в ?save
.
После сохранения файла RData вы можете закомментировать шаги медленной загрузки данных и подведения итогов, а также шаг сохранения и просто загрузить данные следующим образом:
load("~/myProject/cachedData/VLDF.RData")
Этот ответ не зависит от редактора. Он работает одинаково для Emacs, TextMate и т.д. Вы можете сохранять данные в любое место на вашем компьютере. Однако я рекомендую сохранить медленный код в файле сценария R, чтобы вы всегда знали, откуда взялся ваш файл RData, и при необходимости могли воссоздать его из исходных данных.
Я тоже хочу сделать это, когда использую Sweave. Я бы посоветовал поместить все ваши дорогостоящие функции (загрузка и изменение данных) в начале вашего кода. Запустите этот код, затем сохраните рабочую область. Затем закомментируйте дорогие функции и загрузите файл рабочей области с помощью load ()
. Это, конечно, более рискованно, если вы вносите нежелательные изменения в файл рабочей области, но в этом случае у вас все еще есть код в комментариях, если вы хотите начать с нуля.
Не вдаваясь в подробности, я обычно использую один из трех подходов:
assign
, чтобы присвоить уникальное имя каждому важному объекту на протяжении всего моего выполнения. Затем добавьте if (exists (...)) get (...)
в начало каждой функции, чтобы получить значение, или пересчитайте его. (то же, что и предложение Дирка) cacheSweave
с моими документами Sweave
. Это делает за вас всю работу по кэшированию вычислений и автоматически извлекает их. Это действительно тривиально: просто используйте драйвер cacheSweave и добавьте этот флаг в каждый блок: << ..., cache = true >> =
save
и load
, чтобы спасти окружающую среду в критические моменты, снова убедившись, что все имена уникальны.