Handling of foreign C fundamental data types
packing.Rd
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.
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.
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