SEXP objects

knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
knitr::knit_engines$set(callme = callme:::callme_engine)
library(callme)

```{css, echo=FALSE} .callme { background-color: #E3F2FD; } pre.callme span { background-color: #E3F2FD; }

## SEXP objects

All functions callable from R must return a `SEXP`, and only take arguments 
which are of type `SEXP` (or just `void` if there are no arguments).

The `SEXP` type is an `S-Expression`.  Every value in R is an `SEXP`, and 
there is information stored within the type to indicate what data is stored 
within it.

The `TYPEOF()` macro and `type2char()` function within C will be useful to 
identify what sort of data is in the SEXP.


## Listing of all SEXP types

The full list of `SEXP` types are in [Rinternals.h](https://github.com/wch/r-source/blob/trunk/src/include/Rinternals.h)

define NILSXP 0 / nil = NULL /

define SYMSXP 1 / symbols /

define LISTSXP 2 / lists of dotted pairs /

define CLOSXP 3 / closures /

define ENVSXP 4 / environments /

define PROMSXP 5 / promises: [un]evaluated closure arguments /

define LANGSXP 6 / language constructs (special lists) /

define SPECIALSXP 7 / special forms /

define BUILTINSXP 8 / builtin non-special forms /

define CHARSXP 9 / "scalar" string type (internal only)/

define LGLSXP 10 / logical vectors /

/ 11 and 12 were factors and ordered factors in the 1990s /

define INTSXP 13 / integer vectors /

define REALSXP 14 / real variables /

define CPLXSXP 15 / complex variables /

define STRSXP 16 / string vectors /

define DOTSXP 17 / dot-dot-dot object /

define ANYSXP 18 /* make "any" args work.

             Used in specifying types for symbol
             registration to mean anything is okay  */

define VECSXP 19 / generic vectors /

define EXPRSXP 20 / expressions vectors /

define BCODESXP 21 / byte code /

define EXTPTRSXP 22 / external pointer /

define WEAKREFSXP 23 / weak reference /

define RAWSXP 24 / raw bytes /

define OBJSXP 25 / object, non-vector /

define S4SXP 25 / same as OBJSXP, retained for back compatability /

/ used for detecting PROTECT issues in memory.c /

define NEWSXP 30 / fresh node created in new page /

define FREESXP 31 / node released by GC /

define FUNSXP 99 / Closure or Builtin or Special /

## Code example: Print the SEXP type of an object

```{callme}
#| invisible = TRUE
SEXP what_sexp_is_this(SEXP x) {
  Rprintf("SEXPTYPE: %i = %s\n", TYPEOF(x), type2char(TYPEOF(x)));
  return R_NilValue;
}                
what_sexp_is_this(1L)
what_sexp_is_this(TRUE)
what_sexp_is_this(c(1.1, 2.2))
what_sexp_is_this(list(1, 2, 3))
what_sexp_is_this("hello")
what_sexp_is_this(mtcars)
what_sexp_is_this(mean)


Try the callme package in your browser

Any scripts or data that you put into this service are public.

callme documentation built on April 4, 2025, 2:37 a.m.