[R] scripting/littler: How to call function named iteratively (`f1`, `f2`, …)?

David Winsemius dwinsemius at comcast.net
Fri Jul 29 15:58:13 CEST 2011


On Jul 29, 2011, at 9:28 AM, Paul Menzel wrote:

> Dear R folks,
>
>
> wanting to compare different implementations of a solution I want to
> script it to iterate over the different implementations. Is there a  
> way
> to do this in the R shell/command line?

You might consider examining the short and seemingly very well written  
`benchmark` function in the rbenchmark:package. It is designed as a  
testing mechanism but should have the capacity after being stripped of  
some of its bells and whistles to do what you ask. You can probably  
even get it to do what you want by adjusting a few parameters.

>
>        $ more /tmp/iterf.r
>        f1 <- function(n = 100000,
>                       l = 100000)
>        {
>           z = n + l
>        }
>
>        f2 <- function(n = 100000,
>                       l = 100000)
>        {
>           z = 2 * (n + l)
>        }
>
> I tried the following, but it of course does not work.
>
>> source("/tmp/iterf.r")
>> print(f1(2,3))
>        [1] 5
>> print(f2(2,3))
>        [1] 10
>> for (i in 1:2) { print( fi(2, 3) ) }
>        Fehler in print(fi(2, 3)) : konnte Funktion "fi" nicht finden
>
> Can I compose a command from values of variables?

It's also possible that you want some combination of 'assign' or 'ge't  
with paste("name" , 1:10, sep="_"). Or, perish the thought,  
eval(parse(text=paste("f", 1:2, sep="")))

>
> Going on I tried to script that using the `r` from the package  
> `littler`
> [1]. Unfortunately because of the required quotes "" for the command
> `source()` I am not able to expand the variable.

I wasn't able to parse that sentence into standard R/English, but it  
may be that my lack of use of littler is at fault.

>
>        $ for i in $(seq 2); do r -e "print($i)" ; done
>        [1] 1
>        [1] 2
>        $ for i in $(seq 2); do r -e 'source("/tmp/iterf.r");  
> print(1)' ; done
>        [1] 1
>        [1] 1
>        $ # The next example does not work, because the variable $i  
> does not get expanded when surrounded by ''.
>        $ for i in $(seq 2); do r -e 'source("/tmp/iterf.r"); print(f 
> $i(2, 3))' ; done
>        Fehler in print(f$i(2, 3)) : Objekt 'f' nicht gefunden
>        Ausführung angehalten
>        Fehler in print(f$i(2, 3)) : Objekt 'f' nicht gefunden
>        Ausführung angehalten
>
> Searching for »iterating function names« with rseek.org did give any
> good results. I also read the appendix in the introduction to R [2],  
> but
> this did not have anything regarding to this either.
>
> Is there a way to script this?

library(fortunes)
fortune("Yoda")  # surely applies here

David Winsemius, MD
West Hartford, CT



More information about the R-help mailing list