[Rd] Rmpfr: build vector sequentially -- c(.) not working
Jerry Lewis
jerry@lewi@ @ending from biogen@com
Fri Oct 26 23:48:07 CEST 2018
Thank you for your detailed response. I subsequently noticed that
sapply(vec,fn)
also fails if the function fn returns an mpfr object. Will the next version of Rmpfr also fix this usage?
I do enjoy using Rmpfr, and appreciate all that you have done in bringing this capability to the R community.
Thanks,
Jerry
-----Original Message-----
From: Martin Maechler <maechler using stat.math.ethz.ch>
Sent: Friday, October 26, 2018 5:29 AM
To: R Development List <R-devel using r-project.org>
Cc: Martin Maechler (maechler using stat.math.ethz.ch) <maechler using stat.math.ethz.ch>
Subject: Re: Rmpfr: build vector sequentially -- c(.) not working
I've been asked in private,
but am answering in public so others can comment / or find this answer in the future after a web search.
This is about the package 'Rmpfr' (R interface to MPFR, the GNU C library for arbitrary precise numbers).
> How can you build a vector of mpfr numbers sequentially?
> Typically I would do something like the following (and try to replace
> the for loop with some sort of apply construct)
>
> vec <- NULL
> for(...) {
> ...
> vec <- c(vec, vec.new)
> }
Dear Jerry,
In general the above is *bad* R code in the sense that it is unnecessarily inefficient.
In a typical for() loop you know the length of the result in advance, and
vec <- numeric(n)
for(i in seq_along(vec)) {
vec[i] <- .....
}
is *MUCH* faster than your construct when n is not small.
Still, I understand that you would expect mpfr numbers to work as well as many other R objects here -- and they don't :
> However, this does not work with mpfr's. For instance
> c(NULL, 1:3)
> is equivalent to
> 1:3
>
> But
> c(NULL, mpfr(1:3,100))
> is not even the same class as
> mpfr(1:3,100)
Indeed. One can consider this to be unfortunate, but it's nothing I can change as author of 'Rmpfr'.
Rather, this is a shortcoming of R's current implementation of c() which I think may be very hard to be changed in R without either losing to much speed or changing semantic in a too radical way.
[but I'm happy if I'm proven wrong here !! ==> that's why posting to R-devel]
- - - -
Anyway, now to solve your problem, if you really want to do something like your original code, you can do it like this :
mNUL <- mpfr(logical()) # instead of 'NULL'
Then, e.g.,
vec <- mNUL
for(i in 1:10) {
vec <- c(vec, mpfr(i^2, 88))
}
works fine.
In the next version of Rmpfr, both
as(NULL, "mpfr")
mpfr(NULL)
will also give the 'mNUL' above.
I hope you enjoy using Rmpfr!
Best regards,
Martin
Martin Maechler
ETH Zurich
More information about the R-devel
mailing list