Skip to contents

Functions to unpack/pack (read/write) foreign C data types from/to R atomic vectors and C data objects such as arrays and pointers to structures.

Usage

pack(x, offset, sigchar, value)
unpack(x, offset, sigchar)

Arguments

x

atomic vector (logical, raw, integer or double) or external pointer.

offset

integer specifying byte offset starting at 0.

sigchar

character string specifying the C data type by a type signature.

value

R object value to be coerced and packed to a foreign C data type.

Details

The function pack converts an R value into a C data type specified by the signature sigchar and it writes the raw C foreign data value at byte position offset into the object x. The function .unpack extracts a C data type according to the signature sigchar at byte position offset from the object x and converts the C value to an R value and returns it.

Byte offset calculations start at 0 relative to the first byte in an atomic vectors data area.

If x is an atomic vector, a bound check is carried out before read/write access. Otherwise, if x is an external pointer, there is only a C NULL pointer check.

Value

unpack returns a read C data type coerced to an R value.

See also

dyncall for details on type signatures.

Examples

# transfer double to array of floats and back, compare precision:
n <- 6
input <- rnorm(n)
buf <- raw(n*4)
for (i in 1:n) {
    pack(buf, 4 * (i - 1), "f", input[i])
}

output <- numeric(n)
for (i in 1:n) {
    output[i] <- unpack(buf, 4 * (i - 1), "f")
}
# difference between double and float
difference <- output - input
print(cbind(input, output, difference))
#>           input     output    difference
#> [1,]  0.2898989  0.2898988 -1.318732e-08
#> [2,] -1.7006653 -1.7006654 -5.736206e-08
#> [3,]  0.7721537  0.7721537  2.604248e-09
#> [4,]  0.9670204  0.9670203 -2.770565e-08
#> [5,]  0.8280307  0.8280307  4.415400e-10
#> [6,] -0.7767853 -0.7767853  7.645954e-09