Search code examples
rworkspace

R identify workspace objects used in source


Is there a way to identify all the workspace objects created, modified or referenced in a sourced script? I have hundreds of randomly-named objects in my workplace and am 'cleaning house' - I would like to be able to be more proactive about this in the future and just rm() the heck out of the sourced script at the end.


Solution

  • The simplest way is to store your environment objects in a list before sourcing, sourcing, then comparing the new environment objects with the old list.

    Here is some pseudo-code.

    old_objects <- ls()
    source(file)
    new_objects <- setdiff(ls(), c(old_objects, "old_objects"))
    

    This will identify the created objects. To identify whether an object was modified, I don't see another solution than to store all your objects in a list beforehand and then running identical afterwards.

    # rm(list = ls(all = TRUE))
    a <- 1
    b <- 1
    
    old_obj_names <- ls()
    old_objects <- lapply(old_obj_names, get)
    names(old_objects) <- old_obj_names
    
    # source should go here
    a <- 2
    c <- 3
    
    # I add "old_obj_names" and "old_objects" in the setdiff as these
    # were created after the call to ls but before the source
    new_objects <- setdiff(ls(), c(old_obj_names, "old_obj_names", "old_objects"))
    modified_objects <- sapply(old_obj_names, function(x) !identical(old_objects[[x]], get(x)), 
                               USE.NAMES = TRUE)
    modified_objects <- names(modified_objects[modified_objects])
    

    new_objects is indeed "c" and modified_objects is indeed "a" in this example. Obviously, for this to work, you need to ensure that neither old_objects nor old_obj_names are in any way created or modified in the sourced file!