Search code examples
rcran

How to distinguish package namespace environment from other environment objects


Is there any way to programmatically distinguish between package environments and non-package environment objects? For example, the objects x and y below are both environments, with the same class and attributes.

x <- as.environment(cars)
y <- getNamespace("graphics")

However judging from the print method there is a difference:

> print(x)
<environment: 0x1d38118>
> print(y)
<environment: namespace:graphics>

Now suppose I have an arbitrary object, how can I determine which of the two it is (without looking at the output of print)? I would like to know this to determine how to store the object on disk. In case of the former I need to store the list representation of the environment (and perhaps its parents), but for the latter I would just store the name and version of the package.


Solution

  • isNamespace ?

    isNamespace(y)
    # [1] TRUE
    isNamespace(x)
    # [1] FALSE
    

    And, for future reference, apropos is often helpful when you've got a question like this.

    apropos("namespace")
    #  [1] "..getNamespace"         ".BaseNamespaceEnv"      ".getNamespace"         
    #  [4] ".methodsNamespace"      "asNamespace"            "assignInMyNamespace"   
    #  [7] "assignInNamespace"      "attachNamespace"        "fixInNamespace"        
    # [10] "getFromNamespace"       "getNamespace"           "getNamespaceExports"   
    # [13] "getNamespaceImports"    "getNamespaceInfo"       "getNamespaceName"      
    # [16] "getNamespaceUsers"      "getNamespaceVersion"    "isBaseNamespace"       
    # [19] "isNamespace"            "loadedNamespaces"       "loadingNamespaceInfo"  
    # [22] "loadNamespace"          "namespaceExport"        "namespaceImport"       
    # [25] "namespaceImportClasses" "namespaceImportFrom"    "namespaceImportMethods"
    # [28] "packageHasNamespace"    "parseNamespaceFile"     "requireNamespace"      
    # [31] "setNamespaceInfo"       "unloadNamespace"