sapplyMpfr {Rmpfr} | R Documentation |
Apply a Function over a "mpfr" Vector
Description
Users may be disappointed to note that sapply()
or
vapply()
typically do not work with "mpfr"
numbers.
This is a simple (but strong) approach to work around the problem,
based on lapply()
.
Usage
sapplyMpfr(X, FUN, ..., drop_1_ = TRUE)
Arguments
X |
a vector, possibly of class |
FUN |
a |
... |
further arguments passed to |
drop_1_ |
logical (with unusual name on purpose!) indicating if
1-column matrices ( |
Details
In the case FUN(<length-1>)
returns an array
or "mpfrArray"
, i.e.,
with two or more dimensions, sapplyMpfr()
returns an
"mpfrArray"
; this is analogous to sapply(X, FUN, simplify = "array")
(rather than the default sapply()
behaviour which returns a
matrix
also when a higher array would be more “logical”.)
Value
an "mpfr"
vector, typically of the same length
as X
.
Note
This may still not always work as well as sapply()
does for
atomic vectors. The examples seem to indicate that it typically does
work as desired, since Rmpfr version 0.9-0.
If you want to transform back to regular numbers anyway, it maybe simpler and more efficient to use
res <- lapply(....) sapply(res, asNumeric, simplify = "array")
instead of sapplyMpfr()
.
Author(s)
Martin Maechler
See Also
Examples
sapplyMpfr0 <- ## Originally, the function was simply defined as
function (X, FUN, ...) new("mpfr", unlist(lapply(X, FUN, ...), recursive = FALSE))
(m1 <- sapply ( 3, function(k) (1:3)^k)) # 3 x 1 matrix (numeric)
(p1 <- sapplyMpfr(mpfr(3, 64), function(k) (1:3)^k))
stopifnot(m1 == p1, is(p1, "mpfrMatrix"), dim(p1) == c(3,1), dim(p1) == dim(m1))
k.s <- c(2, 5, 10, 20)
(mk <- sapply ( k.s, function(k) (1:3)^k)) # 3 x 4 " "
(pm <- sapplyMpfr(mpfr(k.s, 64), function(k) (1:3)^k))
stopifnot(mk == pm, is(pm, "mpfrMatrix"), dim(pm) == 3:4, 3:4 == dim(mk))
## was *wrongly* 4x3 in Rmpfr 0.8-x
f5k <- function(k) outer(1:5, k+0:2, `^`)# matrix-valued
(mk5 <- sapply ( k.s, f5k)) # sapply()'s default; not "ideal"
(ak5 <- sapply ( k.s, f5k, simplify = "array")) # what we want
(pm5 <- sapplyMpfr(mpfr(k.s, 64), f5k))
stopifnot(c(mk5) == c(ak5), ak5 == pm5, is(pm5, "mpfrArray"), is.array(ak5),
dim(pm5) == dim(ak5), dim(pm5) == c(5,3, 4))
if(require("Bessel")) { # here X, is simple
bI1 <- function(k) besselI.nuAsym(mpfr(1.31e9, 128), 10, expon.scaled=TRUE, k.max=k)
bImp1 <- sapplyMpfr (0:4, bI1, drop_1_ = FALSE) # 1x5 mpfrMatrix -- as in DPQ 0.8-8
bImp <- sapplyMpfr (0:4, bI1, drop_1_ = TRUE ) # 5 "mpfr" vector {by default}
bImp0 <- sapplyMpfr0(0:4, bI1) # 5-vector
stopifnot(identical(bImp, bImp0), bImp == bImp1,
is(bImp, "mpfr"), is(bImp1, "mpfrMatrix"), dim(bImp1) == c(1, 5))
}# {Bessel}