Description Usage Arguments Details Author(s) See Also Examples
The LLint class is a container for storing a vector of large integers (i.e. long long int values at the C level).
1 2 3 |
length |
A non-negative number (i.e. integer, double, or LLint value) specifying the desired length. |
x |
Object to be coerced or tested. |
LLint vectors aim to provide the same functionality as integer vectors in base R but their values are stored as long long int values at the C level vs int values for integer vectors. Note that on Intel platforms long long int values are 64-bit and int values 32-bit only. Therefore LLint vectors can hold values in the +/-9.223e18 range (approximately) vs +/-2.147e9 only for integer vectors.
NAs are supported and the NA_LLint_
constant is predefined for
convenience as as(NA, "LLint")
.
Names are not supported for now.
Coercions from/to logical, integer, double, and character are supported.
Operations from the Arith
, Compare
and
Summary
groups are supported.
More operations coming soon...
Hervé Pagès
integer vectors in base R.
The Arith
, Compare
and
Summary
group generics in the methods package.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 | ## A long long int uses 8 bytes (i.e. 64 bits) in C:
.Machine$sizeof.longlong
## ---------------------------------------------------------------------
## SIMPLE EXAMPLES
## ---------------------------------------------------------------------
LLint()
LLint(10)
as.LLint(3e9)
as.LLint("3000000000")
x <- as.LLint(1:10 * 111111111)
x * x
5 * x # result as vector of doubles (i.e. 'x' coerced to double)
5L * x # result as LLint vector (i.e. 5L coerced to LLint vector)
max(x)
min(x)
range(x)
sum(x)
x <- as.LLint(1:20)
prod(x)
x <- as.LLint(1:21)
prod(x) # result is out of LLint range (+/-9.223e18)
prod(as.numeric(x))
x <- as.LLint(1:75000)
sum(x * x * x) == sum(x) * sum(x)
## Note that max(), min() and range() *always* return an LLint vector
## when called on an LLint vector, even when the vector is empty:
max(LLint()) # NA with no warning
min(LLint()) # NA with no warning
## This differs from how max(), min() and range() behave on an empty
## integer vector:
max(integer()) # -Inf with a warning
min(integer()) # Inf with a warning
## ---------------------------------------------------------------------
## GOING FROM STRINGS TO INTEGERS
## ---------------------------------------------------------------------
## as.integer() behaves like as.integer(as.double()) on a character
## vector. With the following consequence:
s <- "-2.9999999999999999"
as.integer(s) # -3
## as.LLint() converts the string *directly* to LLint, without
## coercing to double first:
as.LLint(s) # decimal part ignored
## ---------------------------------------------------------------------
## GOING FROM DOUBLE-PRECISION VALUES TO INTEGERS AND VICE-VERSA
## ---------------------------------------------------------------------
## Be aware that a double-precision value is not guaranteed to represent
## exactly an integer > 2^53. This can cause some surprises:
2^53 == 2^53 + 1 # TRUE, yep!
## And therefore:
as.LLint(2^53) == as.LLint(2^53 + 1) # also TRUE
## This can be even more disturbing when passing a big literal integer
## value because the R parser will turn it into a double-precision value
## before passing it to as.LLint():
x1 <- as.LLint(9007199254740992) # same as as.LLint(2^53)
x1
x2 <- as.LLint(9007199254740993) # same as as.LLint(2^53 + 1)
x2
x1 == x2 # still TRUE
## However, no precision is lost if a string literal is used instead:
x1 <- as.LLint("9007199254740992")
x1
x2 <- as.LLint("9007199254740993")
x2
x1 == x2 # FALSE
x2 - x1
d1 <- as.double(x1)
d2 <- as.double(x2) # warning!
d1 == d2 # TRUE
## ---------------------------------------------------------------------
## LLint IS IMPLEMENTED AS AN S4 CLASS
## ---------------------------------------------------------------------
class(LLint(10))
typeof(LLint(10)) # S4
storage.mode(LLint(10)) # S4
is.vector(LLint(10)) # FALSE
is.atomic(LLint(10)) # FALSE
## This means that an LLint vector cannot go in an ordinary data
## frame:
## Not run:
data.frame(id=as.LLint(1:5)) # error!
## End(Not run)
## A DataFrame needs to be used instead:
DataFrame(id=as.LLint(1:5))
## ---------------------------------------------------------------------
## SANITY CHECKS
## ---------------------------------------------------------------------
x <- as.integer(c(0, 1, -1, -3, NA, -99))
y <- as.integer(c(-6, NA, -4:3, 0, 1999, 6:10, NA))
xx <- as.LLint(x)
yy <- as.LLint(y)
## Operations from "Arith" group:
stopifnot(identical(x + y, as.integer(xx + yy)))
stopifnot(identical(as.LLint(y + x), yy + xx))
stopifnot(identical(x - y, as.integer(xx - yy)))
stopifnot(identical(as.LLint(y - x), yy - xx))
stopifnot(identical(x * y, as.integer(xx * yy)))
stopifnot(identical(as.LLint(y * x), yy * xx))
stopifnot(identical(x / y, xx / yy))
stopifnot(identical(y / x, yy / xx))
stopifnot(identical(x %/% y, as.integer(xx %/% yy)))
stopifnot(identical(as.LLint(y %/% x), yy %/% xx))
stopifnot(identical(x %% y, as.integer(xx %% yy)))
stopifnot(identical(as.LLint(y %% x), yy %% xx))
stopifnot(identical(x ^ y, xx ^ yy))
stopifnot(identical(y ^ x, yy ^ xx))
## Operations from "Compare" group:
stopifnot(identical(x == y, xx == yy))
stopifnot(identical(y == x, yy == xx))
stopifnot(identical(x != y, xx != yy))
stopifnot(identical(y != x, yy != xx))
stopifnot(identical(x <= y, xx <= yy))
stopifnot(identical(y <= x, yy <= xx))
stopifnot(identical(x >= y, xx >= yy))
stopifnot(identical(y >= x, yy >= xx))
stopifnot(identical(x < y, xx < yy))
stopifnot(identical(y < x, yy < xx))
stopifnot(identical(x > y, xx > yy))
stopifnot(identical(y > x, yy > xx))
## Operations from "Summary" group:
stopifnot(identical(max(y), as.integer(max(yy))))
stopifnot(identical(max(y, na.rm=TRUE), as.integer(max(yy, na.rm=TRUE))))
stopifnot(identical(min(y), as.integer(min(yy))))
stopifnot(identical(min(y, na.rm=TRUE), as.integer(min(yy, na.rm=TRUE))))
stopifnot(identical(range(y), as.integer(range(yy))))
stopifnot(identical(range(y, na.rm=TRUE), as.integer(range(yy, na.rm=TRUE))))
stopifnot(identical(sum(y), as.integer(sum(yy))))
stopifnot(identical(sum(y, na.rm=TRUE), as.integer(sum(yy, na.rm=TRUE))))
stopifnot(identical(prod(y), as.double(prod(yy))))
stopifnot(identical(prod(y, na.rm=TRUE), as.double(prod(yy, na.rm=TRUE))))
|
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.