How to distinguish package namespace environment from other environment objects

StackOverflow https://stackoverflow.com/questions/19937824

  •  30-07-2022
  •  | 
  •  

Question

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.

Was it helpful?

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"    
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top