Re: [R] eval(parse(text vs. get when accessing a function

From: Ramon Diaz-Uriarte <rdiaz_at_cnio.es>
Date: Fri 05 Jan 2007 - 18:40:57 GMT

On Friday 05 January 2007 19:21, Peter Dalgaard wrote:
> Ramon Diaz-Uriarte wrote:
> > Dear All,
> >
> > I've read Thomas Lumley's fortune "If the answer is parse() you should
> > usually rethink the question.". But I am not sure it that also applies
> > (and why) to other situations (Lumley's comment
> > http://tolstoy.newcastle.edu.au/R/help/05/02/12204.html
> > was in reply to accessing a list).
> >
> > Suppose I have similarly called functions, except for a postfix. E.g.
> >
> > f.1 <- function(x) {x + 1}
> > f.2 <- function(x) {x + 2}
> >
> > And sometimes I want to call f.1 and some other times f.2 inside another
> > function. I can either do:
> >
> > g <- function(x, fpost) {
> > calledf <- eval(parse(text = paste("f.", fpost, sep = "")))
> > calledf(x)
> > ## do more stuff
> > }
> >
> >
> > Or:
> >
> > h <- function(x, fpost) {
> > calledf <- get(paste("f.", fpost, sep = ""))
> > calledf(x)
> > ## do more stuff
> > }
> >
> >
> > Two questions:
> > 1) Why is the second better?
> >
> > 2) By changing g or h I could use "do.call" instead; why would that be
> > better? Because I can handle differences in argument lists?

Dear Peter,

Thanks for your answer.

>
> Who says that they are better? If the question is how to call a
> function specified by half of its name, the answer could well be to use
> parse(), the point is that you should rethink whether that was really
> the right question.
>
> Why not instead, e.g.
>
> f <- list("1"=function(x) {x + 1} , "2"=function(x) {x + 2})
> h <- function(x, fpost) f[[fpost]](x)
>
> > h(2,"2")
>
> [1] 4
>
> > h(2,"1")
>
> [1] 3
>

I see, this is direct way of dealing with the problem. However, you first need to build the f list, and you might not know about that ahead of time. For instance, if I build a function so that the only thing that you need to do to use my function g is to call your function "f.something", and then pass the "something".

I am still under the impression that, given your answer, using "eval(parse(text" is not your preferred way. What are the possible problems (if there are any, that is). I guess I am puzzled by "rethink whether that was really the right question".

Thanks,

R.

> > Thanks,
> >
> >
> > R.

-- 
Ramón Díaz-Uriarte
Centro Nacional de Investigaciones Oncológicas (CNIO)
(Spanish National Cancer Center)
Melchor Fernández Almagro, 3
28029 Madrid (Spain)
Fax: +-34-91-224-6972
Phone: +-34-91-224-6900

http://ligarto.org/rdiaz
PGP KeyID: 0xE89B3462
(http://ligarto.org/rdiaz/0xE89B3462.asc)



**NOTA DE CONFIDENCIALIDAD** Este correo electrónico, y en s...{{dropped}}

______________________________________________
R-help@stat.math.ethz.ch mailing list
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.
Received on Sat Jan 06 15:52:10 2007

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.1.8, at Sat 06 Jan 2007 - 05:30:24 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.