[R] help with functions

jim holtman
Sat, 05 Sep 2009 19:56:04 -0000

Try this variation; might have something to do with scope:

testA<-function(input)
{
     dat<- data.frame(A=seq(input,5), B=seq(6,10))
     vec.names<- c("a", "b")
     for(i in 1:ncol(dat))
     {
           tab<- dat[,i]-1
           assign(vec.names[i], tab)
     }
     do.call("rbind", lapply(vec.names, function(x) get(x)))
}

Just changed the way 'get' was done in the lapply

On Fri, Sep 4, 2009 at 10:00 AM, jonas
garcia<garcia.jonas80 at googlemail.com> wrote:
> Hi all,
>
>
>
> I have got 2 function (see bellow) which are simplifications of what I need
> to do. These functions are precisely the same, except for the last line.
>
>
>
> My question is, why doesn't function testA work in the same way as
function
> testB.
>
> Both functions produce two objects, "a" and "b" that
must merged with rbind.
> The difference is that in testA, I specify the name of the objects while in
> testA I am stating which objects I want to bind from a character vector.
>
>
>
> What's more, if I just run the code without a function (example given
below
> as well), they both work...
>
> Why is this?
>
>
>
> Thanks in advance
>
>
>
> Jonas
>
>
>
>
>
> testA<-function(input)
>
> {
>
> ? ? ?dat<- data.frame(A=seq(input,5), B=seq(6,10))
>
> ? ? ?vec.names<- c("a", "b")
>
> ? ? ?for(i in 1:ncol(dat))
>
> ? ? ?{
>
> ? ? ? ? ? ?tab<- dat[,i]-1
>
> ? ? ? ? ? ?assign(vec.names[i], tab)
>
> ? ? ?}
>
>
>
> ? ? ?do.call("rbind", lapply(vec.names, get))
>
> }
>
>
>
>
>
>
>
> testB<-function(input)
>
> {
>
> ? ? ?dat<- data.frame(A=seq(input,5), B=seq(6,10))
>
> ? ? ?vec.names<- c("a", "b")
>
> ? ? ?for(i in 1:ncol(dat))
>
> ? ? ?{
>
> ? ? ? ? ? ?tab<- dat[,i]-1
>
> ? ? ? ? ? ?assign(vec.names[i], tab)
>
> ? ? ?}
>
>
>
> ? ? ?rbind(a,b)
>
> }
>
>
>
>
>
>
>
> testA(1)
>
> Error in FUN(c("a", "b")[[1L]], ...) : object
'a' not found
>
>
>
> testB(1)
>
> ?[,1] [,2] [,3] [,4] [,5]
>
> a ? ?0 ? ?1 ? ?2 ? ?3 ? ?4
>
> b ? ?5 ? ?6 ? ?7 ? ?8 ? ?9
>
>
>
>
>
>
>
>
###################################################################################
>
>
>
>
>
>
>
> ? ? ?dat<- data.frame(A=seq(1,5), B=seq(6,10))
>
> ? ? ?vec.names<- c("a", "b")
>
> ? ? ?for(i in 1:ncol(dat))
>
> ? ? ?{
>
> ? ? ? ? ? ?tab<- dat[,i]-1
>
> ? ? ? ? ? ?assign(vec.names[i], tab)
>
> ? ? ?}
>
>
>
> ? ? ?do.call("rbind", lapply(vec.names, get))
>
> ? ? [,1] [,2] [,3] [,4] [,5]
>
> [1,] ? ?0 ? ?1 ? ?2 ? ?3 ? ?4
>
> [2,] ? ?5 ? ?6 ? ?7 ? ?8 ? ?9
>
>
>
>
>
>
>
>
>
> dat<- data.frame(A=seq(1,5), B=seq(6,10))
>
> ? ? ?vec.names<- c("a", "b")
>
> ? ? ?for(i in 1:ncol(dat))
>
> ? ? ?{
>
> ? ? ? ? ? ?tab<- dat[,i]-1
>
> ? ? ? ? ? ?assign(vec.names[i], tab)
>
> ? ? ?}
>
>
>
> ? ? ?rbind(a,b)
>
> ?[,1] [,2] [,3] [,4] [,5]
>
> a ? ?0 ? ?1 ? ?2 ? ?3 ? ?4
>
> b ? ?5 ? ?6 ? ?7 ? ?8 ? ?9
>
> ? ? ? ?[[alternative HTML version deleted]]
>
> ______________________________________________
> R-help at r-project.org 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.
>



--
Jim Holtman
Cincinnati, OH
+1 513 646 9390

What is the problem that you are trying to solve?