def do_slot_assign(self, name: str, value) -> None: _rinterface._assert_valid_slotname(name) cchar = conversion._str_to_cchar(name) with memorymanagement.rmemory() as rmemory: name_r = rmemory.protect(openrlib.rlib.Rf_install(cchar)) cdata = rmemory.protect(conversion._get_cdata(value)) openrlib.rlib.R_do_slot_assign(self.__sexp__._cdata, name_r, cdata)
def build_rcall(rfunction, args=[], kwargs=[]): rlib = openrlib.rlib with memorymanagement.rmemory() as rmemory: rcall = rmemory.protect(rlib.Rf_allocList(len(args) + len(kwargs) + 1)) _SET_TYPEOF(rcall, rlib.LANGSXP) rlib.SETCAR(rcall, rfunction) item = rlib.CDR(rcall) for val in args: cdata = rmemory.protect(conversion._get_cdata(val)) rlib.SETCAR(item, cdata) item = rlib.CDR(item) for key, val in kwargs: if key is not None: _assert_valid_slotname(key) rlib.SET_TAG(item, rlib.Rf_install(conversion._str_to_cchar(key))) cdata = rmemory.protect(conversion._get_cdata(val)) rlib.SETCAR(item, cdata) item = rlib.CDR(item) return rcall
def __setitem__(self, key: str, value) -> None: # TODO: move body to _rinterface-level function if not (isinstance(key, str) and len(key)): raise ValueError('The key must be a non-empty string.') if (self.__sexp__._cdata == openrlib.rlib.R_BaseEnv) or \ (self.__sexp__._cdata == openrlib.rlib.R_EmptyEnv): raise ValueError('Cannot remove variables from the base or ' 'empty environments.') # TODO: call to Rf_duplicate needed ? with memorymanagement.rmemory() as rmemory: symbol = rmemory.protect( openrlib.rlib.Rf_install(conversion._str_to_cchar(key))) cdata = rmemory.protect(conversion._get_cdata(value)) cdata_copy = rmemory.protect(openrlib.rlib.Rf_duplicate(cdata)) openrlib.rlib.Rf_defineVar(symbol, cdata_copy, self.__sexp__._cdata)