Exemplo n.º 1
0
    def rcall(self,
              keyvals,
              environment: typing.Optional[SexpEnvironment] = None):
        """Call/evaluate an R function.

        Args:
        - keyvals: a sequence of key/value (name/parameter) pairs. A
          name/parameter that is None will indicated an unnamed parameter.
          Like in R, keys/names do not have to be unique, partial matching
          can be used, and named/unnamed parameters can occur at any position
          in the sequence.
        - environment: an optional R environment to evaluate the function.
        """
        # TODO: check keyvals are pairs ?
        if environment is None:
            environment = _evaluation_context
        assert isinstance(environment, SexpEnvironment)
        error_occured = _rinterface.ffi.new('int *', 0)

        with memorymanagement.rmemory() as rmemory:
            call_r = rmemory.protect(
                _rinterface.build_rcall(self.__sexp__._cdata, [], keyvals))
            res = rmemory.protect(
                openrlib.rlib.R_tryEval(call_r, environment.__sexp__._cdata,
                                        error_occured))
            if error_occured[0]:
                raise embedded.RRuntimeError(_rinterface._geterrmessage())
        return res
Exemplo n.º 2
0
 def __call__(self, *args, **kwargs) -> Sexp:
     error_occured = _rinterface.ffi.new('int *', 0)
     with memorymanagement.rmemory() as rmemory:
         call_r = rmemory.protect(
             _rinterface.build_rcall(self.__sexp__._cdata, args,
                                     kwargs.items()))
         res = rmemory.protect(
             openrlib.rlib.R_tryEval(call_r, globalenv.__sexp__._cdata,
                                     error_occured))
         if error_occured[0]:
             raise embedded.RRuntimeError(_rinterface._geterrmessage())
     return res
Exemplo n.º 3
0
 def rcall(self, keyvals, environment: SexpEnvironment):
     # TODO: check keyvals are pairs ?
     assert isinstance(environment, SexpEnvironment)
     error_occured = _rinterface.ffi.new('int *', 0)
     with memorymanagement.rmemory() as rmemory:
         call_r = rmemory.protect(
             _rinterface.build_rcall(self.__sexp__._cdata, [], keyvals))
         res = rmemory.protect(
             openrlib.rlib.R_tryEval(call_r, environment.__sexp__._cdata,
                                     error_occured))
         if error_occured[0]:
             raise embedded.RRuntimeError(_rinterface._geterrmessage())
     return res