On 04/07/2015 8:21 AM, David Winsemius wrote:
> 
>> On Jul 3, 2015, at 11:05 PM, Duncan Murdoch <murdoch.dun...@gmail.com> wrote:
>>
>> On 04/07/2015 3:45 AM, David Winsemius wrote:
>>>
>>>> On Jul 3, 2015, at 5:08 PM, David Winsemius <dwinsem...@comcast.net> wrote:
>>>>
>>>>
>>>>
>>>> It doesn’t appear to me that mpfr was ever designed to handle expressions 
>>>> as the first argument.
>>>
>>> This could be a start. Obviously one would wnat to include code to do other 
>>> substitutions probably using the all.vars function to pull out the other 
>>> “constants” and ’numeric’ values to make them of equivalent precision. I’m 
>>> guessing you want to follow the parse-tree and then testing the numbers for 
>>> integer-ness and then replacing by paste0( “mpfr(“, val, “L, “, prec,”)” )
>>>
>>> Pre <- function(expr, prec){ sexpr <- deparse(substitute(expr) )
>>
>> Why deparse?  That's almost never a good idea.  I can't try your code (I
>> don't have mpfr available), but it would be much better to modify the
>> expression than the text representation of it.  For example, I think
>> your code would modify strings containing "pi", or variables with those
>> letters in them, etc.  If you used substitute(expr) without the
>> deparse(), you could replace the symbol "pi" with the call to the Const
>> function, and be more robust.
>>
> 
> Really? I did try. I was  fairly sure that someone could do better but I 
> don’t see an open path along the lines you suggest. I’m pretty sure I tried 
> `substitute(expr, list(pi= pi))` when `expr` had been the formal argument and 
> got disappointed because there is no `pi` in the expression `expr`. I 
> _thought_ the problem was that `substitute` does not evaluate its first 
> argument, but I do admit to be pretty much of a klutz with this sort of 
> programming. I don’t think you need to have mpfr installed in order to 
> demonstrate this.

The substitute() function really does two different things.
substitute(expr) (with no second argument) grabs the underlying
expression out of a promise.  substitute(expr, list(pi = pi)) tries to
make the substitution in the expression "expr", so it doesn't see "pi".

This should work:

do.call(substitute, list(expr = substitute(expr), env=list(pi =
Const(pi, 120))))

(but I can't evaluate the Const function to test it).

This works:

do.call(substitute, list(expr = substitute(expr), env = list(pi =
quote(Const(pi, 120)))))

because it never evaluates the Const function, it just returns some code
that you could modify more if you liked.

Duncan Murdoch

______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to