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

Peter Dalgaard P.Dalgaard at biostat.ku.dk
Fri Jan 5 19:21:34 CET 2007


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?
>
>   
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

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


-- 
   O__  ---- Peter Dalgaard             Øster Farimagsgade 5, Entr.B
  c/ /'_ --- Dept. of Biostatistics     PO Box 2099, 1014 Cph. K
 (*) \(*) -- University of Copenhagen   Denmark          Ph:  (+45) 35327918
~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk)                  FAX: (+45) 35327907



More information about the R-help mailing list