How do I log an R session to a file?

32,823

Solution 1

Do you know about sink() in base R ?

There are also some logging packages on CRAN: logging, log4r and possibly more.

Lastly, Emacs user have ESS and its transcript mode. You can save your session as a log, and in general, the 'work from file and execute from the file' approach builds a (partial, commands-only) log as you work.

Solution 2

For the sake of completing the answer using sink

# copy the log to a text file
sink("./logofcode.txt")
Your R code(s) goes here
you can use a stored R code as well using source()
source("./XS_SPEC_CF.R",echo=T, max.deparse.length=1e3)
sink()

Solution 3

There's savehistory(file) which will write the entire history as plaintext, or, if you're trying to log output, use sink(file, split = TRUE).

Solution 4

In addition to the sink function you might also look at the txtStart and related functions in the TeachingDemos package or the similar functionality in the R2HTML package (which came first).

Solution 5

There is also a package called logr that allows you a lot of control over what and when things get logged, but is much easier to use than sink(). Here is an example:

library(logr)

# Open the log
log_open("mytest.log")

# Print text to the log
log_print("Here is a test log statement")

# Print a dataframe to the log
log_print(mtcars)

# Close the log
log_close()


And here is the generated log:

========================================================================= 
Log Path: ./log/mytest.log 
Working Directory: C:/packages/Testing/VS 
User Name: User 
R Version: 4.0.3 (2020-10-10) 
Machine: BOSAK-HOME x86-64 
Operating System: Windows 10 x64 build 18363 
Log Start Time: 2021-01-24 21:13:55 
========================================================================= 

Here is a test log statement 

NOTE: Log Print Time:  2021-01-24 21:13:56 
NOTE: Elapsed Time in seconds: 1.07599902153015 

                     mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Valiant             18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
Merc 230            22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
Merc 280            19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
Merc 280C           17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
Merc 450SE          16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
Merc 450SL          17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
Fiat 128            32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
Honda Civic         30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
Toyota Corolla      33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
Toyota Corona       21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
Pontiac Firebird    19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
Fiat X1-9           27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
Porsche 914-2       26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
Lotus Europa        30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
Ferrari Dino        19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
Volvo 142E          21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

NOTE: Data frame has 32 rows and 11 columns. 

NOTE: Log Print Time:  2021-01-24 21:13:57 
NOTE: Elapsed Time in seconds: 0.795979976654053 

========================================================================= 
Log End Time: 2021-01-24 21:14:06 
Log Elapsed Time: 0 00:00:10 
========================================================================= 
Share:
32,823

Related videos on Youtube

James Howard
Author by

James Howard

Updated on January 25, 2021

Comments

  • James Howard
    James Howard over 3 years

    Other than through redirection, which captures an entire session, is there a way to start and stop logging during an R session? To clarify, I am looking for something similar to the log using command in Stata.

    • James Howard
      James Howard over 12 years
      I also think this is the dumbest question ever posted, but there isn't a "dumb-question" tag.
  • James Howard
    James Howard over 12 years
    sink() was exactly what I was looking for, but completely unintuitively named. As I said in my comment, I know this is dumb. Thanks!
  • der_grund
    der_grund over 6 years
    Since I need to do this quite often, I converted usct01's approach into a tiny function: source_with_log <- function(r_script, log_file) { sink(file = log_file) source(r_script, echo = TRUE) sink() }
  • James Howard
    James Howard over 3 years
    Noting it's been 8 years since the original question (!!), I did recently learn of logr, but had never seen it in action. I recently fell hard for spdlog for spewing information in both C++ and Python. Thanks for the update!