[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