[R] How can I run a function to a piece of text?

Alberto Monteiro albmont at centroin.com.br
Fri Oct 16 21:07:08 CEST 2009


Javier PB wrote:
> 
> I got really stuck trying to apply a function to a piece of code 
> that I created using different string functions.
> 
> To make things really easy, this is a wee example:
> 
> x<-c(1:10)
> script<-"x, trim = 0, na.rm = FALSE"        ##script created by a 
> number of paste() and rep() steps mean(script)                       
>                 ##function that I want to apply: doesn't work
> 
> Is there any way to convert the "script" class so that the function 
> mean() can read it as if it were text typed in the console?
> 
That's a really tricky question.

I think that there are two solutions, both of them pass through
an alternate way of calling functions.

Namely: for each function that can be called as f(x=a, y=b, z=c), you
can use do.call(f, list(x=a,y=b,z=c)) or even do.call(f, list(a, b, c)).

Let's test this.

f <- function(x, y) x + 2 * y

f(1, 2)

do.call(f, list(1, 2))

So far so good. The problem now is that you don't have a
list(x, trim = 0, na.rm = FALSE), but a string!

But it's a piece of cake to convert a string to an R object
(but only after you know the magic words, and they are
eval(parse(text=string))):

eval(parse(text = paste("list(", script, ")", sep = ""))

So, a slow and didatical(sp?) solution to your problem is:

x<-c(1:10)
script<-"x, trim = 0, na.rm = FALSE"
# Step 1: convert script to a list - but still as a string
script.list.string <- paste("list(", script, ")", sep = "")
# Step 2: convert script to a list
script.list <- eval(parse(text = script.list.string))
# Step 3: call the function
do.call(mean, script.list)
                  
The second way (and simpler) is to enclose the "mean" function
into the script string, and then invoke the magic words:

x<-c(1:10)
script<-"x, trim = 0, na.rm = FALSE"
# Step 1: convert script to the calling of mean - but still as a string
mean.string <- paste("mean(", script, ")", sep = "")
# Step 2: compute it
eval(parse(text = mean.string))

Alberto Monteiro




More information about the R-help mailing list