Skip to content

sxp(x) is similar to .Internal(inspect(x)), recursing into the C data structures underlying any R object. The main difference is the output is a little more compact, it recurses fully, and avoids getting stuck in infinite loops by using a depth-first search. It also returns a list that you can compute with, and carefully uses colour to highlight the most important details.

Usage

sxp(x, expand = character(), max_depth = 5L)

Arguments

x

Object to inspect

expand

Optionally, expand components of the true that are usually suppressed. Use:

  • "character" to show underlying entries in the global string pool.

  • "environment" to show the underlying hashtables.

  • "altrep" to show the underlying data.

  • "call" to show the full AST (but ast() is usually superior)

  • "bytecode" to show generated bytecode.

max_depth

Maximum depth to recurse. Use max_depth = Inf (with care!) to recurse as deeply as possible. Skipped elements will be shown as ....`

Details

The name sxp comes from SEXP, the name of the C data structure that underlies all R objects.

See also

Other object inspectors: ast(), ref()

Examples

x <- list(
  TRUE,
  1L,
  runif(100),
  "3"
)
sxp(x)
#> [1:0x5566d0462348] <VECSXP[4]> (named:4)
#>   [2:0x5566cf9fae68] <LGLSXP[1]> (named:3)
#>   [3:0x5566cf9faea0] <INTSXP[1]> (named:3)
#>   [4:0x5566cffca350] <REALSXP[100]> (named:1)
#>   [5:0x5566cf9faf10] <STRSXP[1]> (named:3)

# Expand "character" to see underlying CHARSXP entries in the global
# string pool
x <- c("banana", "banana", "apple", "banana")
sxp(x)
#> [1:0x5566d008a698] <STRSXP[4]> (named:4)
sxp(x, expand = "character")
#> [1:0x5566d008a698] <STRSXP[4]> (named:4)
#>   [2:0x5566cfa78628] <CHARSXP> (named:10)
#>   [2:0x5566cfa78628]
#>   [3:0x5566cfa786d0] <CHARSXP> (named:4)
#>   [2:0x5566cfa78628]

# Expand altrep to see underlying data
x <- 1:10
sxp(x)
#> [1:0x5566cb51d988] <INTSXP[10]> (altrep named:65535)
sxp(x, expand = "altrep")
#> [1:0x5566cb51d988] <INTSXP[10]> (altrep named:65535)
#>   _class [2:0x5566ca8f0f30] <RAWSXP[144]> (named:7357)
#>     _attrib [3:0x5566ca9271c8] <LISTSXP> (named:1)
#>       [4:0x5566ca9273f8] <SYMSXP: compact_intseq> (named:37)
#>       [5:0x5566ca8f25f0] <SYMSXP: base> (named:65535)
#>       [6:0x5566ca925468] <INTSXP[1]> (named:2)
#>   _data1 [7:0x5566d056f1d8] <REALSXP[3]> (named:1)
#>   _data2 <NILSXP>

# Expand environmnets to see the underlying implementation details
e1 <- new.env(hash = FALSE, parent = emptyenv(), size = 3L)
e2 <- new.env(hash = TRUE, parent = emptyenv(), size = 3L)
e1$x <- e2$x <- 1:10

sxp(e1)
#> [1:0x5566d0690a28] <ENVSXP> (named:5)
#>   x [2:0x5566cfcb51c0] <INTSXP[10]> (altrep named:65535)
#>   _enclos [3:0x5566ca8f38f8] <ENVSXP: empty> (named:65535)
sxp(e1, expand = "environment")
#> [1:0x5566d0690a28] <ENVSXP> (named:6)
#>   _frame [2:0x5566cfcb4ba0] <LISTSXP> (named:1)
#>     x [3:0x5566cfcb51c0] <INTSXP[10]> (altrep named:65535)
#>   _hashtab <NILSXP>
#>   _enclos [5:0x5566ca8f38f8] <ENVSXP: empty> (named:65535)
sxp(e2, expand = "environment")
#> [1:0x5566d098b1c0] <ENVSXP> (named:5)
#>   _frame <NILSXP>
#>   _hashtab [3:0x5566d05705a8] <VECSXP[3/1]> (named:1)
#>     [4:0x5566cfcb4eb0] <LISTSXP> (named:1)
#>       x [5:0x5566cfcb51c0] <INTSXP[10]> (altrep named:65535)
#>     <NILSXP>
#>     <NILSXP>
#>   _enclos [6:0x5566ca8f38f8] <ENVSXP: empty> (named:65535)