2016-02-29 2 views
1

Я преподаватель, и мои ученики проявили интерес к записи кода, который я запускаю в классе. Так как это часто бывает вне манжеты, я хотел бы иметь легкую функцию, которую я мог бы запустить в конце класса, которая сохранила бы все, что я запускал в сеансе. Я знаю, что savehistory() сохранит всю мою историю, но это не то, что я ищу.Сохранение истории из определенной сессии

Как и у this вопрос, за исключением того, что я считаю, что у меня есть педагогически обоснованная причина для истории, и я хочу ограничить то, что сохраняется на основе сеанса, а не на основе количества строк ,

+0

Вы готовите код заранее? Если нет, возможно, вы могли бы использовать jupyter notebook, работающий R в качестве одного из вариантов (не автоматизированный ноутбук)? – sckott

+0

Я готовлю код заранее, который доступен студентам в электронном виде и на раздаточных материалах. Но часто есть вещи, которые приходят ко мне, когда мы работаем («что, если мы хотим добавить термин взаимодействия?», «Позволяет проверять арифметику на этом» и т. Д.), И мои ученики хотели бы записать. – AmeliaMN

+0

Возможный дубликат [Как зарегистрировать сеанс R в файле?] (Http://stackoverflow.com/questions/9636656/how-do-i-log-an-r-session-to-a-file) –

ответ

4

Я думаю, что если вы вызываете R с --no-restore-history (так, что история с предыдущих сессий не прилагается к протоколу для этого) и добавить

.Last <- function() { 
    if(interactive()) 
     try(savehistory(paste0("~/.Rhistory_", sys.time()))) 
} 

к вашему Rprofile, вы должны получить самодостаточным, и timestamped файлы истории каждый раз, когда R закрывается естественным образом.

Функция .Last, заданная в глобальной среде, вызывается непосредственно перед нормальным закрытием. См. ?.Last

NB: это не сохранит вашу историю в случае фатальной ошибки (сбоя) в самом R, хотя это не должно сильно зависеть от учебного контекста.

NB2: приведенный выше код будет иметь имена файлов с пробелами в них. В зависимости от вашей ОС это может варьироваться от каких-либо серьезных проблем до причесок nightmarescape. Если это проблема, оберните sys.time() с вашим любимым кодом форматирования даты и времени, например. format(sys.time(), "<format string>") или что-то от lubridate (возможно, я на самом деле не знаю, так как сам не пользуюсь).

2

В версии разработки rite on GitHub (> = v0.3.6) вы можете использовать функцию sinkstart(), чтобы сбрасывать весь ваш код, все ваши результаты или оба на небольшой интерактивный виджет Tcl/tk, из которого вы может затем просто скопировать или сохранить результат.

Чтобы сделать его работу вы можете сделать это:

devtools::install_github("leeper/rite") 

library("rite") 
sinkstart(print.eval = FALSE, prompt.echo = "", split = TRUE) 
## any code here 
sinkstop() # stop printing to the widget 

Это будет выглядеть примерно так:

sink

Вы можете динамически изменять то, что печатается в виджете из контекста (справа -click) в виджетах. Вы также можете динамически переключаться между sinkstart() и sinkstop(), если вам нужен только какой-либо вывод кода и/или результатов.

Полное раскрытие информации: Это пакет, который я разработал.

Смежные вопросы