Source code for rpy2.robjects.environments
import rpy2.rinterface as rinterface
from rpy2.robjects.robject import RObjectMixin, RObject
from rpy2.robjects import conversion
_new_env = rinterface.baseenv["new.env"]
[docs]class Environment(RObjectMixin, rinterface.SexpEnvironment):
""" An R environement, implementing Python's mapping interface. """
def __init__(self, o=None):
if o is None:
o = _new_env(hash=rinterface.SexpVector([True, ],
rinterface.LGLSXP))
super(Environment, self).__init__(o)
def __getitem__(self, item):
res = super(Environment, self).__getitem__(item)
res = conversion.converter.ri2ro(res)
# objects in a R environment have an associated name / symbol
try:
res.__rname__ = item
except AttributeError:
# the 3rd-party conversion function can return objects
# for which __rname__ cannot be set (because of fixed
# __slots__ and no __rname__ in the original set
# of attributes)
pass
return res
def __setitem__(self, item, value):
robj = conversion.converter.py2ri(value)
super(Environment, self).__setitem__(item, robj)
[docs] def get(self, item, wantfun = False):
""" Get a object from its R name/symol
:param item: string (name/symbol)
:rtype: object (as returned by :func:`conversion.converter.ri2ro`)
"""
res = super(Environment, self).get(item, wantfun = wantfun)
res = conversion.converter.ri2ro(res)
res.__rname__ = item
return res
[docs] def keys(self):
""" Return a tuple listing the keys in the object """
return (x for x in self)
[docs] def items(self):
""" Iterate through the symbols and associated objects in
this R environment."""
for k in self:
yield (k, self[k])
[docs] def values(self):
""" Iterate through the objects in
this R environment."""
for k in self:
yield self[k]
[docs] def pop(self, *args):
""" E.pop(k[, d]) -> v, remove the specified key
and return the corresponding value. If the key is not found,
d is returned if given, otherwise KeyError is raised."""
l = len(args)
k = args[0]
if k in self:
v = self[k]
del(self[k])
elif l == 1:
raise KeyError(k)
else:
v = args[1]
return v
[docs] def popitem(self):
""" E.popitem() -> (k, v), remove and return some (key, value)
pair as a 2-tuple; but raise KeyError if E is empty. """
if len(self) == 0:
raise KeyError()
kv = next(self.items())
del(self[kv[0]])
return kv
[docs] def clear(self):
""" E.clear() -> None. Remove all items from D. """
## FIXME: is there a more efficient implementation (when large
## number of keys) ?
for k in self:
del(self[k])