Exemple #1
0
 def __setitem__(
     self, i: typing.Union[int, slice],
     value: typing.Union[str, typing.Sequence[typing.Optional[str]],
                         'StrSexpVector', 'na_values.NA_Character']
 ) -> None:
     cdata = self.__sexp__._cdata
     if isinstance(i, int):
         i_c = _rinterface._python_index_to_c(cdata, i)
         if isinstance(value, Sexp):
             val_cdata = value.__sexp__._cdata
         else:
             if not isinstance(value, str):
                 value = str(value)
             val_cdata = _as_charsxp_cdata(value)
         self._R_SET_VECTOR_ELT(cdata, i_c, val_cdata)
     elif isinstance(i, slice):
         for i_c, v in zip(range(*i.indices(len(self))), value):
             if v is None:
                 v_cdata = openrlib.rlib.R_NaString
             else:
                 if not isinstance(value, str):
                     v = str(v)
                 v_cdata = _as_charsxp_cdata(v)
             self._R_SET_VECTOR_ELT(cdata, i_c, v_cdata)
     else:
         raise TypeError('Indices must be integers or slices, '
                         'not %s' % type(i))
Exemple #2
0
 def __setitem__(self, i: int, value) -> None:
     cdata = self.__sexp__._cdata
     i_c = _rinterface._python_index_to_c(cdata, i)
     openrlib.rlib.SETCAR(
         openrlib.rlib.Rf_nthcdr(cdata, i_c),
         value.__sexp__._cdata
     )
Exemple #3
0
 def get_charsxp(self, i: int) -> CharSexp:
     """Get the R CharSexp objects for the index i."""
     i_c = _rinterface._python_index_to_c(self.__sexp__._cdata, i)
     return CharSexp(
         _rinterface.SexpCapsule(
             openrlib.rlib.STRING_ELT(self.__sexp__._cdata, i_c)
         )
     )
Exemple #4
0
 def __setitem__(self, i: typing.Union[int, slice],
                 value: sexp.SupportsSEXP) -> None:
     if isinstance(i, slice):
         raise NotImplementedError(
             'Assigning slices to LangSexpVectors is not yet implemented.')
     cdata = self.__sexp__._cdata
     i_c = _rinterface._python_index_to_c(cdata, i)
     openrlib.rlib.SETCAR(openrlib.rlib.Rf_nthcdr(cdata, i_c),
                          value.__sexp__._cdata)
Exemple #5
0
 def __setitem__(self, i: Union[int, slice], value) -> None:
     cdata = self.__sexp__._cdata
     if isinstance(i, int):
         i_c = _rinterface._python_index_to_c(cdata, i)
         openrlib.SET_REAL_ELT(cdata, i_c, float(value))
     elif isinstance(i, slice):
         for i_c, v in zip(range(*i.indices(len(self))), value):
             openrlib.SET_REAL_ELT(cdata, i_c, float(v))
     else:
         raise TypeError('Indices must be integers or slices, not %s' %
                         type(i))
Exemple #6
0
 def __setitem__(self, i: typing.Union[int, slice], value) -> None:
     cdata = self.__sexp__._cdata
     if isinstance(i, int):
         i_c = _rinterface._python_index_to_c(cdata, i)
         self._R_SET_VECTOR_ELT(cdata, i_c, value.__sexp__._cdata)
     elif isinstance(i, slice):
         for i_c, v in zip(range(*i.indices(len(self))), value):
             self._R_SET_VECTOR_ELT(cdata, i_c, v.__sexp__._cdata)
     else:
         raise TypeError('Indices must be integers or slices, not %s' %
                         type(i))
Exemple #7
0
 def __setitem__(self, i: int, value) -> None:
     cdata = self.__sexp__._cdata
     if isinstance(i, int):
         i_c = _rinterface._python_index_to_c(cdata, i)
         openrlib.COMPLEX(cdata)[i_c] = self._CAST_IN(value)
     elif isinstance(i, slice):
         for i_c, v in zip(range(*i.indices(len(self))), value):
             openrlib.COMPLEX(cdata)[i_c] = self._CAST_IN(v)
     else:
         raise TypeError('Indices must be integers or slices, not %s' %
                         type(i))
Exemple #8
0
 def __getitem__(self, i: Union[int, slice]) -> Sexp:
     cdata = self.__sexp__._cdata
     rlib = openrlib.rlib
     if isinstance(i, int):
         # R-exts says that it is converted to a VECSXP when subsetted.
         i_c = _rinterface._python_index_to_c(cdata, i)
         item_cdata = rlib.Rf_nthcdr(cdata, i_c)
         with memorymanagement.rmemory() as rmemory:
             res_cdata = rmemory.protect(
                 rlib.Rf_allocVector(RTYPES.VECSXP, 1))
             rlib.SET_VECTOR_ELT(
                 res_cdata,
                 0,
                 rlib.CAR(
                     item_cdata
                 ))
             res_name = rmemory.protect(
                 rlib.Rf_allocVector(RTYPES.STRSXP, 1))
             item_cdata_name = rlib.PRINTNAME(rlib.TAG(item_cdata))
             if _rinterface._TYPEOF(item_cdata_name) != rlib.NILSXP:
                 rlib.SET_STRING_ELT(
                     res_name,
                     0,
                     item_cdata_name)
                 rlib.Rf_namesgets(res_cdata, res_name)
             res = conversion._cdata_to_rinterface(res_cdata)
     elif isinstance(i, slice):
         iter_indices = range(*i.indices(len(self)))
         n = len(iter_indices)
         with memorymanagement.rmemory() as rmemory:
             res_cdata = rmemory.protect(
                 rlib.Rf_allocVector(
                     self._R_TYPE, n)
             )
             iter_res_cdata = res_cdata
             prev_i = 0
             lst_cdata = self.__sexp__._cdata
             for i in iter_indices:
                 if i >= len(self):
                     raise IndexError('index out of range')
                 lst_cdata = rlib.Rf_nthcdr(lst_cdata, i - prev_i)
                 prev_i = i
                 rlib.SETCAR(iter_res_cdata,
                             rlib.CAR(lst_cdata))
                 rlib.SET_TAG(iter_res_cdata,
                              rlib.TAG(lst_cdata))
                 iter_res_cdata = rlib.CDR(iter_res_cdata)
             res = conversion._cdata_to_rinterface(res_cdata)
     else:
         raise TypeError(
             'Indices must be integers or slices, not %s' % type(i))
     return res
Exemple #9
0
 def __setitem__(self, i: int, value):
     cdata = self.__sexp__._cdata
     if isinstance(i, int):
         i_c = _rinterface._python_index_to_c(cdata, i)
         openrlib.rlib.RAW(cdata)[i_c] = _cast_in_byte(value)
     elif isinstance(i, slice):
         for i_c, v in zip(range(*i.indices(len(self))), value):
             if v > 255:
                 raise ValueError('byte must be in range(0, 256)')
             openrlib.rlib.RAW(cdata)[i_c] = _cast_in_byte(v)
     else:
         raise TypeError('Indices must be integers or slices, not %s' %
                         type(i))
Exemple #10
0
 def __getitem__(self, i: int) -> typing.Union[float, 'FloatSexpVector']:
     cdata = self.__sexp__._cdata
     if isinstance(i, int):
         i_c = _rinterface._python_index_to_c(cdata, i)
         res = openrlib.REAL_ELT(cdata, i_c)
     elif isinstance(i, slice):
         res = type(self).from_iterable([
             openrlib.REAL_ELT(cdata, i_c)
             for i_c in range(*i.indices(len(self)))
         ])
     else:
         raise TypeError('Indices must be integers or slices, not %s' %
                         type(i))
     return res
Exemple #11
0
 def __getitem__(
         self, i: Union[int, slice]) -> Union[complex, 'ComplexSexpVector']:
     cdata = self.__sexp__._cdata
     if isinstance(i, int):
         i_c = _rinterface._python_index_to_c(cdata, i)
         _ = openrlib.COMPLEX_ELT(cdata, i_c)
         res = complex(_.r, _.i)
     elif isinstance(i, slice):
         res = type(self).from_iterable([
             openrlib.COMPLEX_ELT(cdata, i_c)
             for i_c in range(*i.indices(len(self)))
         ])
     else:
         raise TypeError('Indices must be integers or slices, not %s' %
                         type(i))
     return res
Exemple #12
0
 def __getitem__(self, i: Union[int, slice]) -> Union[int, 'IntSexpVector']:
     cdata = self.__sexp__._cdata
     if isinstance(i, int):
         i_c = _rinterface._python_index_to_c(cdata, i)
         res = openrlib.INTEGER_ELT(cdata, i_c)
         if res == NA_Integer:
             res = NA_Integer
     elif isinstance(i, slice):
         res = type(self).from_iterable([
             openrlib.INTEGER_ELT(cdata, i_c)
             for i_c in range(*i.indices(len(self)))
         ])
     else:
         raise TypeError('Indices must be integers or slices, not %s' %
                         type(i))
     return res
Exemple #13
0
 def __getitem__(self, i: int) -> typing.Union[typing.Optional[bool],
                                               'BoolSexpVector']:
     cdata = self.__sexp__._cdata
     if isinstance(i, int):
         i_c = _rinterface._python_index_to_c(cdata, i)
         elt = openrlib.LOGICAL_ELT(cdata, i_c)
         res = na_values.NA_Logical if elt == NA_Logical else bool(elt)
     elif isinstance(i, slice):
         res = type(self).from_iterable(
             [openrlib.LOGICAL_ELT(cdata, i_c)
              for i_c in range(*i.indices(len(self)))]
         )
     else:
         raise TypeError(
             'Indices must be integers or slices, not %s' % type(i))
     return res
Exemple #14
0
 def __setitem__(
         self,
         i: typing.Union[int, slice],
         value: typing.Union[str, typing.Sequence[typing.Optional[str]],
                             'StrSexpVector', 'NACharacterType']
 ) -> None:
     cdata = self.__sexp__._cdata
     if isinstance(i, int):
         i_c = _rinterface._python_index_to_c(cdata, i)
         if isinstance(value, Sexp):
             val_cdata = value.__sexp__._cdata
         else:
             if not isinstance(value, str):
                 value = str(value)
             val_cdata = _as_charsxp_cdata(value)
         self._R_SET_VECTOR_ELT(
             cdata, i_c,
             val_cdata
         )
     elif isinstance(i, slice):
         value_slice: typing.Iterable
         if (
                 isinstance(value, NACharacterType)
                 or
                 isinstance(value, str)
         ):
             value_slice = itertools.cycle((value, ))
         elif len(value) == 1:
             value_slice = itertools.cycle(value)
         else:
             value_slice = value
         for i_c, _ in zip(range(*i.indices(len(self))), value_slice):
             if _ is None:
                 v_cdata = openrlib.rlib.R_NaString
             else:
                 if isinstance(_, str):
                     v = _
                 else:
                     v = str(_)
                 v_cdata = _as_charsxp_cdata(v)
             self._R_SET_VECTOR_ELT(
                 cdata, i_c,
                 v_cdata
             )
     else:
         raise TypeError('Indices must be integers or slices, '
                         'not %s' % type(i))
Exemple #15
0
 def __getitem__(
     self, i: typing.Union[int, slice]
 ) -> typing.Union['StrSexpVector', str, 'na_values.NA_Character']:
     cdata = self.__sexp__._cdata
     if isinstance(i, int):
         i_c = _rinterface._python_index_to_c(cdata, i)
         res = _rinterface._string_getitem(cdata, i_c)
         if res is None:
             res = na_values.NA_Character
     elif isinstance(i, slice):
         res = self.from_iterable([
             _rinterface._string_getitem(cdata, i_c)
             for i_c in range(*i.indices(len(self)))
         ])
     else:
         raise TypeError('Indices must be integers or slices,'
                         ' not %s' % type(i))
     return res
Exemple #16
0
 def __getitem__(
         self,
         i: typing.Union[int, slice]) -> typing.Union[Sexp, VT, typing.Any]:
     cdata = self.__sexp__._cdata
     if isinstance(i, int):
         i_c = _rinterface._python_index_to_c(cdata, i)
         res = conversion._cdata_to_rinterface(
             self._R_VECTOR_ELT(cdata, i_c))
     elif isinstance(i, slice):
         res = self.from_iterable([
             self._R_VECTOR_ELT(
                 cdata,
                 i_c,
             ) for i_c in range(*i.indices(len(self)))
         ],
                                  cast_value=lambda x: x)
     else:
         raise TypeError('Indices must be integers or slices, not %s' %
                         type(i))
     return res
Exemple #17
0
 def __getitem__(
     self, i: Union[int, slice]
 ) -> Union[bool, 'sexp.NALogicalType', 'BoolSexpVector']:
     res: Union[bool, 'sexp.NALogicalType', 'BoolSexpVector']
     cdata = self.__sexp__._cdata
     if isinstance(i, int):
         i_c = _rinterface._python_index_to_c(cdata, i)
         elt = openrlib.LOGICAL_ELT(cdata, i_c)
         res = (
             na_values.NA_Logical  # type: ignore
             if elt == NA_Logical else bool(elt))
     elif isinstance(i, slice):
         res = type(self).from_iterable([
             openrlib.LOGICAL_ELT(cdata, i_c)
             for i_c in range(*i.indices(len(self)))
         ])
     else:
         raise TypeError('Indices must be integers or slices, not %s' %
                         type(i))
     return res
Exemple #18
0
 def __getitem__(self, i: int):
     cdata = self.__sexp__._cdata
     i_c = _rinterface._python_index_to_c(cdata, i)
     return openrlib.rlib.CAR(openrlib.rlib.Rf_nthcdr(cdata, i_c))