Exercises

1. Why is tracemem(1:10) not useful?

Because it tries to trace a value that is not bound to a name

2. Why are there two copies?
x <- c(1L, 2L, 3L)
tracemem(x)
#> [1] "<0x557c286c78f8>"
x[[3]] <- 4
#> tracemem[0x557c286c78f8 -> 0x557c2b0ca1d8]: eval eval withVisible withCallingHandlers eval eval with_handlers doWithOneRestart withOneRestart withRestartList doWithOneRestart withOneRestart withRestartList doWithOneRestart withOneRestart withRestartList withRestarts <Anonymous> evaluate in_dir in_input_dir eng_r block_exec call_block process_group withCallingHandlers <Anonymous> process_file <Anonymous> <Anonymous> render_cur_session <Anonymous> 
#> tracemem[0x557c2b0ca1d8 -> 0x557c2bcea588]: eval eval withVisible withCallingHandlers eval eval with_handlers doWithOneRestart withOneRestart withRestartList doWithOneRestart withOneRestart withRestartList doWithOneRestart withOneRestart withRestartList withRestarts <Anonymous> evaluate in_dir in_input_dir eng_r block_exec call_block process_group withCallingHandlers <Anonymous> process_file <Anonymous> <Anonymous> render_cur_session <Anonymous>

Because we convert an integer vector (using 1L, etc.) to a double vector (using just 4)-

3. What is the relationships among these objects?
a <- 1:10      
b <- list(a, a)
c <- list(b, a, 1:10) # 

a <- obj 1
b <- obj 1, obj 1
c <- b(obj 1, obj 1), obj 1, 1:10

ref(c)
#> █ [1:0x557c2b6a5c28] <list> 
#> ├─█ [2:0x557c2b50e0d8] <list> 
#> │ ├─[3:0x557c2aa672a8] <int> 
#> │ └─[3:0x557c2aa672a8] 
#> ├─[3:0x557c2aa672a8] 
#> └─[4:0x557c2a714d00] <int>
4. What happens here?
x <- list(1:10)
x[[2]] <- x
  • x is a list
  • x[[2]] <- x creates a new list, which in turn contains a reference to the original list
  • x is no longer bound to list(1:10)
ref(x)
#> █ [1:0x557c2c1384c8] <list> 
#> ├─[2:0x557c2b9d17a8] <int> 
#> └─█ [3:0x557c2b99d568] <list> 
#>   └─[2:0x557c2b9d17a8]