--- title: "SEXP objects" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{SEXP objects} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} 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; } ``` ```{r} 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) ```